题目链接:http://poj.org/problem?id=2631
求树上的最大距离
方法:任选一点bfs,求出其他点到此点的最短距离,然后选取距离最大的点(此点为最长路的一个端点)再做一次bfs,然后选取距离最大的点(此点为最长路的另外一个端点)二者之间的距离即为树上的最大距离。
code:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#define INF 1000000000
using namespace std;
const int maxn=10050;
const int maxe=40000;
struct edge
{
int to,next,cost;
} P[maxe];
int head[maxn],si;
int dis[maxn],que[maxe],nn;
void add_edge(int s,int t,int cc)
{
P[si].to=t;
P[si].cost=cc;
P[si].next=head[s];
head[s]=si++;
}
void bfs(int u)
{
for(int i=0;i<=nn;i++) dis[i]=INF;
int hh,tt;
hh=tt=0;
que[tt++]=u;
dis[u]=0;
while(hh!=tt){
int v=que[hh++];
for(int i=head[v];i!=-1;i=P[i].next){
int mid=P[i].to;
if(dis[v]+P[i].cost<dis[mid]){
dis[mid]=dis[v]+P[i].cost;
que[tt++]=mid;
}
}
}
}
int main()
{
int s,t,cc;
nn=0;
memset(head,-1,sizeof(head));
si=0;
while(scanf("%d%d%d",&s,&t,&cc)!=EOF){
add_edge(s,t,cc);
add_edge(t,s,cc);
nn=max(nn,s);
nn=max(nn,t);
}
bfs(1);
s=1;
for(int i=2;i<=nn;i++) if(dis[i]>dis[s]) s=i;
bfs(s);
t=1;
for(int i=2;i<=nn;i++) if(dis[i]>dis[t]) t=i;
printf("%d\n",dis[t]);
return 0;
}