如果乙個點開始遍歷一棵樹再回到原點那麼每條邊走兩次。
現在是兩個人從同一點出發,那麼最後遍歷完以後兩人離得越遠越好。
最後兩人所處位置的路徑上的邊走了一次,其他邊走了兩次。
要使總路程最小,兩人最後停在直徑兩端。
所以最終答案就是總權值*2 - 樹的直徑
1 #include 2 #include 3 #include 4 #include 5 #include 6**君using
namespace
std;78
const
int maxn = 100000 + 10;9
10int
n, s;
11 vectorg[maxn], c[maxn];
1213
intlen, id;
1415
void dfs(int u, int fa, int
d)16
18for(int i = 0; i < g[u].size(); i++)
1924}25
26int
main()
2731
32int sum = 0;33
for(int i = 1; i < n; i++)
3440
41int
a;42 len = -1
;43 dfs(1, 0, 0
);44 len = -1
;45 a =id;
46 dfs(a, 0, 0
);47
48 printf("
%d\n
", sum -len);49}
5051
return0;
52 }
POJ1849 Two(樹的直徑)
題意 有一顆n個結點的帶權的無向樹,在s結點放兩個機械人,這兩個機械人會把樹的每條邊都走一遍,但是最後機械人不要求回到出發點.問你兩個機械人走的路總長之和的最小值是多少?思路 考慮從乙個結點遍歷整個樹再回到原點需要把每個邊計算兩遍,這裡機械人不用回到出發點,所以兩個機械人到達的點越遠越好。讓兩個機械...
poj 1849 貪心 樹形dp
題意是 在m點有兩輛車,要清掃所有的路,問走的最短路。題目鏈結 和poj1935 差不多,poj 1935 是乙個人走的最短路。題解 所有邊權和 2 樹的最長路徑。樹形dp的解法不會,include include include includeusing namespace std define ...
poj 1985 樹的直徑
題意 求樹的直徑。樹的直徑即樹上距離最遠的兩個點之間的距離 思路 以任意點開始深搜,得到距離其最遠的點 再以求得的點開始深搜,再次搜得的最遠距離即為樹的直徑 include include define n 100005 struct edgee n 2 int first n flag n top...