題意:有一顆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...