dfs 樹的直徑 Jzoj P1737 刪邊

2022-09-18 01:00:15 字數 1644 閱讀 3085

description

給出n個點,n-1條邊的連通圖.

現要求刪除一條邊,使得連通塊的直徑總和最大.所謂連通塊的直徑是指連通塊中最遠兩點之間的距離。

問:直徑總和最大是多少?

input

檔名為 delete.in

第一行正整數n.

接下來n-1行.每行兩個數,a,b,len表示a,b(1<=a,b<=n)有一條長度為len(1<=len<=1000)的邊連線著.

output

檔名為 delete.out

乙個數ans.直徑總和的最大值.

sample input

10

2 1 982

3 1 169

4 1 934

5 1 325

6 1 735

7 1 675

8 2 302

9 3 450

10 5 173

sample output

2668

data constraint

hint

【資料範圍】

30% n<=100

70% n<=5000

100% n<=100000

1 #include2 #include3

using

namespace

std;

4struct edge e[100010*2];5

int mx[2][100010][4],d[2][100010][4],fa[100010],head[100010],dis[100010

],ans,n,cnt;

6void insert(int x,int y,int z)

7void dfs(intx)8

23else

if (dis[v]>mx[0][x][2]) mx[0][x][2]=dis[v];

24int vis=mx[1][v][1]+e[i].v;

25if (vis>mx[1][x][1

])26

33else

34if (vis>mx[1][x][2

])35

40else

if (vis>mx[1][x][3]) mx[1][x][3]=vis;41}

42}43 dis[x]=max(mx[1][x][1]+mx[1][x][2],mx[0][x][1

]);44}45

void find(int x,int a,int

b)

4659

else

6064

if (d[0][x][1]==v) mx3=mx[0][x][2]; else mx3=mx[0][x][1

];65 find(v,max(max(a,mx3),max(mx1+b,mx2)),max(b,mx1)+e[i].v);66}

67}68}

69int

main()

7078 dfs(1

);79 find(1,0,0

);80 printf("%d"

,ans);

81return0;

82 }

樹的直徑 兩次dfs求樹的直徑

樹的直徑是一棵樹的某兩個最深的葉子節點的連線,多用於與圖論演算法巢狀考 1 很簡單的演算法,不會單獨考,學習和熟練使用它的多種情況 很簡單,兩次dfs 至於為什麼,可以畫圖模擬一下,因為一次dfs必然會在一棵子樹或者根節點上,每次dfs必然找到一棵子樹的最深的葉子節點,那麼第二次dfs必然找到另外一...

HDU 2196 dfs 樹的直徑

今天乙個師哥講了圖的高階,感覺師哥講的很好,有很多啟發性的問題。其中乙個問題是圖的搜尋和圖的遍歷有什麼區別?最大的區別就是遍歷只需要掃瞄一遍圖。而每一次搜尋可能都需要搜尋全圖的時間複雜度。所以如果拿沒有優化的搜尋去暴力的話,每一次搜尋都需要遍歷一遍圖。這樣有很大的可能性是會t的。接下來講講 hdu ...

lightoj 1094 樹的直徑 DFS

題意 一共n各節點編號0 n 1,輸入n 1條無向邊代表u v距離為w,求最遠的兩個點的距離 即樹的直徑 思路 如果用最短路徑來求,n 30000是會超時的,正確做法是先隨便從乙個點開始深搜,搜到最遠的節點一定是直徑其中乙個節點,然後從這個點再來次深搜。1 include 2 using names...