POJ 2631

题意:找一颗树中的最长路。

题解:两边bfs,第一次以任意结点开始,找到一个距离它最远的结点,第二次从该节点开始,找到距离它最远的路,这边是最长路。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=10005,M=1000000;
 6 int head[N],nc;
 7 struct Edge
 8 {
 9     int to,cost,next;
10 }edge[M];
11 void add(int a,int b,int c)
12 {
13     edge[nc].to=b;edge[nc].cost=c;edge[nc].next=head[a];head[a]=nc++;
14     edge[nc].to=a;edge[nc].cost=c;edge[nc].next=head[b];head[b]=nc++;
15 }
16 int dist[N],stk[N];
17 bool vis[N];
18 int bfs(int k)
19 {
20     memset(dist,0,sizeof(dist));
21     memset(vis,false,sizeof(vis));
22     int f,r;
23     f=r=0;
24     vis[stk[r++]=k]=true;
25     int ans=0,id=k;
26     while(f!=r)
27     {
28         int now=stk[f++];
29         if(dist[now]>ans)
30             ans=dist[id=now];
31         for(int i=head[now];i!=-1;i=edge[i].next)
32         {
33             int to=edge[i].to,cc=edge[i].cost;
34             if(!vis[to])
35             {
36                 vis[to]=true;
37                 dist[to]=dist[now]+cc;
38                 stk[r++]=to;
39             }
40         }
41     }
42     return id;
43 }
44 int main()
45 {
46     int a,b,c;
47     memset(head,-1,sizeof(head));
48     nc=0;
49     while(scanf("%d%d%d",&a,&b,&c)!=EOF)
50         add(a,b,c);
51     printf("%d\n",dist[bfs(bfs(a))]);
52     return 0;
53 }

转载于:https://www.cnblogs.com/tmeteorj/archive/2012/10/10/2718815.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值