原文:http://blog.acmj1991.com/?p=608
题意:给你一棵树让你找到相聚最远的两个点
思路:对任意一点进行广搜找到相距最远的点,再对这一点进行广搜找到与它相距最远的点,他们之间的距离就是最大的距
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxN 40100
int num,head[maxN],dis[maxN],vis[maxN];
struct node{
int v,next,w;
}po[200000];
void add(int u,int v,int w)
{
po[num].v=v,po[num].w=w;
po[num].next=head[u],head[u]=num++;
po[num].v=u,po[num].w=w;
po[num].next=head[v],head[v]=num++;
}
int BFS(int s)
{
int maxx=0,k=s,hd=0,tail=0,q[maxN*4];
q[hd++]=s;vis[s]=1;
while(hd!=tail)
{
int u=q[tail++];
for(int i=head[u];i!=-1;i=po[i].next)
if(!vis[po[i].v]){
dis[po[i].v]=dis[u]+po[i].w;
q[hd++]=po[i].v;
if(dis[po[i].v]>dis[k])k=po[i].v;
vis[po[i].v]=1;
}
}
return k;
}
int main()
{
int n,m;
char str[5];
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int u,v,w;
scanf("%d%d%d%s",&u,&v,&w,str);
add(u,v,w);
}
int k=BFS(1);
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
k=BFS(k);
printf("%d\n",dis[k]);
}