http://acm.hdu.edu.cn/showproblem.php?pid=4514
题目意思:求最长路径,先了解树的直经
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。
现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
其中,可以兴建的路线均是双向的,他们之间的长度均大于0。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 #define N 100001 6 #define M 1000001 7 struct st 8 { 9 int num,step,father; 10 }; 11 int u[M * 2],v[M * 2],w[M * 2],next[M * 2],first[N],flag[N]; 12 int n,m,ans; 13 int bfs(struct st start) 14 { 15 queue<st> q; 16 while(!q.empty()) q.pop(); 17 q.push(start); 18 struct st qq,pp; 19 int nn; 20 flag[start.num] = 1; 21 int ss = 0; 22 while(!q.empty()) 23 { 24 qq = q.front(); 25 q.pop(); 26 for(int e = first[qq.num];e != -1;e = next[e]) 27 { 28 if(flag[v[e]] && qq.father != v[e]) 29 ss = 1; 30 else if(!flag[v[e]] || qq.father != v[e]) 31 { 32 flag[v[e]] = 1; 33 pp.num = v[e]; 34 pp.step = qq.step + w[e]; 35 pp.father = qq.num; 36 q.push(pp); 37 if(pp.step > ans) 38 { 39 ans = pp.step; 40 nn = pp.num; 41 } 42 } 43 } 44 } 45 if(ss) return -1; 46 else 47 return nn; 48 } 49 int main() 50 { 51 while(~scanf("%d %d",&n,&m)) 52 { 53 memset(flag,0,sizeof(flag)); 54 for(int i = 1;i <= n;i ++) 55 first[i] = -1; 56 for(int i = 1;i <= m;i ++) 57 { 58 scanf("%d %d %d",&u[i * 2 - 1],&v[i * 2 - 1],&w[i * 2 - 1]); 59 next[i * 2 - 1] = first[u[i * 2 - 1]]; 60 first[u[i * 2 - 1]] = i * 2 - 1; 61 u[i * 2] = v[i * 2 - 1]; 62 v[i * 2] = u[i * 2 - 1]; 63 w[i * 2] = w[i * 2 - 1]; 64 next[i * 2] = first[u[i * 2]]; 65 first[u[i * 2]] = i * 2; 66 } 67 int x,max = 0,f = 0; 68 struct st start; 69 for(int i = 1;i <= n;i ++) 70 { 71 if(flag[i]) continue; 72 start.num = i; 73 start.step = 0; 74 ans = 0; 75 x = bfs(start); 76 if(x == -1) 77 { 78 f = 1; 79 puts("YES"); 80 break; 81 } 82 else 83 { 84 memset(flag,0,sizeof(flag)); 85 start.num = x; 86 start.step = 0; 87 ans = 0; 88 x = bfs(start); 89 if(ans > max) 90 max = ans; 91 } 92 } 93 if(f == 0) 94 printf("%d\n",max); 95 } 96 return 0; 97 }