POJ1849 Two(樹的直徑)

2021-08-26 12:43:53 字數 798 閱讀 8361

題意:有一顆n個結點的帶權的無向樹, 在s結點放兩個機械人, 這兩個機械人會把樹的每條邊都走一遍, 但是最後機械人不要求回到出發點. 問你兩個機械人走的路總長之和的最小值是多少?

思路:考慮從乙個結點遍歷整個樹再回到原點需要把每個邊計算兩遍,這裡機械人不用回到出發點,所以兩個機械人到達的點越遠越好。讓兩個機械人在初始位置在直徑上背道而馳,這樣最優解就是所有邊*2-直徑,因為直徑只走了一次,而其他邊必走兩遍。

可以看看圖示:

#include#include#include#include#include#includeusing namespace std;

struct node

;const int n=100010;

vectorv[n];

int vis[n],dis[n],ans;

int bfs(int x)

for(int i=0;i}}

return point;

}int main()

); v[y].push_back((node));

sum+=z;

}ans=0;

int point=bfs(m);

ans=0;

bfs(point);

printf("%d\n",sum*2-ans);

for(int i=1;i<=n;i++) v[i].clear();}}

POJ 1849 樹的直徑 Two

如果乙個點開始遍歷一棵樹再回到原點那麼每條邊走兩次。現在是兩個人從同一點出發,那麼最後遍歷完以後兩人離得越遠越好。最後兩人所處位置的路徑上的邊走了一次,其他邊走了兩次。要使總路程最小,兩人最後停在直徑兩端。所以最終答案就是總權值 2 樹的直徑 1 include 2 include 3 includ...

poj 1985 樹的直徑

題意 求樹的直徑。樹的直徑即樹上距離最遠的兩個點之間的距離 思路 以任意點開始深搜,得到距離其最遠的點 再以求得的點開始深搜,再次搜得的最遠距離即為樹的直徑 include include define n 100005 struct edgee n 2 int first n flag n top...

poj4607 樹的直徑)

題目 park visit 題意 乙個人去公園,想走k個景點,問最短的距離。思路 求出樹的直徑 最長的鏈 最長路徑 從任意點a,找到離a最遠點b。再找到離b最遠點c,bc就是最長路徑。如果k include include include include include include includ...