大臣的旅费

转载请注明出处: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 }

 

posted @ 2018-02-18 22:09  nefuer  阅读(228)  评论(0编辑  收藏  举报