http://acm.hdu.edu.cn/showproblem.php?pid=4514

题目意思:求最长路径,先了解树的直经

随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。
  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
  其中,可以兴建的路线均是双向的,他们之间的长度均大于0。

代码如下:

View Code
 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 }

 

 

posted @ 2013-03-29 13:43  fly_lovelove  阅读(188)  评论(0编辑  收藏  举报