转载请注明出处:http://www.cnblogs.com/zhishoumuguinian/p/8453272.html
思路:从任意一点a开始找到最长路径的终点为b, 在从b开始找最长路径的终点为d。 b, d之间的路径就是图中最长路径。证明略。粘上代码。
1 #include<bits/stdc++.h>
2
3 using namespace std;
4 struct Road
5 {
6 int d, L;
7 };
8 vector< vector<Road> >G(11000);
9 int maxLen = 0;
10 int totalLen = 0;
11 int N, num;
12 int midl;
13 int visited[11000]= {0};
14 void dfs(int s)
15 {
16 if(num > N) return;
17 for(int i=0; i<G[s].size(); i++)
18 {
19 Road r = G[s][i];
20 if(!visited[r.d])
21 {
22 totalLen += r.L;
23 num++;
24 visited[r.d]=1;
25 if(totalLen > maxLen)
26 {
27 maxLen = totalLen;
28 midl = r.d;
29 }
30 dfs(r.d);
31 totalLen -= r.L;
32 }
33 }
34 }
35
36 int main()
37 {
38 cin>> N;
39 for(int i=0; i<N-1; i++)//读入数据
40 {
41 Road r;
42 int s;
43 cin>>s >> r.d >> r.L;
44 G[s].push_back(r);
45 Road t;
46 t.d=s;
47 t.L=r.L;
48 G[r.d].push_back(t);
49 }
50 num=1;
51 visited[1]=1;
52 dfs(1);//任意一点开始dfs
53 totalLen=0;
54 maxLen=0;
55 num=1;
56
57 memset(visited, 0, sizeof(visited));//为重新dfs准备
58 visited[midl]=1;
59 dfs(midl);//上一最长路径终点开始dfs
60 int a=11;
61 int b=maxLen+10;
62 int sum=(a+b)*maxLen/2;
63 cout<< sum;
64 }