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
102 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 #include3using
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...