1895这个题输入的方向是没用的,就是给出一棵树,求树的直径。
2631 中n是1W,m没给出,是个单实例,注意边数是0要输出0.
所谓树的直径就是一棵树中距离最远的两点的长度.
先从任意一点开始bfs,找到距离其最远的点x,那么x就是直径的一个端点,从x出发bfs一发找到最远的距离就是树的直径。
证明网上一大堆,善用baidu..
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<set>
#include<vector>
#include<iterator>
#include<map>
#include<queue>
using namespace std;
#define LL long long
struct node
{
int u,v,w,next;
}edge[44000];
int head[44000],used[44000],dis[44000],t,ans;
int n,m;
void add(int u,int v,int w)
{
edge[t].v=v;
edge[t].w=w;
edge[t].next=head[u];
head[u]=t++;
}
int bfs(int s)
{
memset(used,0,sizeof(used));
memset(dis,0,sizeof(dis));
queue<int> q;
q.push(s);
used[s]=1;
int k=0;
while(!q.empty())
{
int u=q.front();
if(dis[u]>ans)
{
ans=dis[u];
k=u;
}
q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(used[v]==0)
{
dis[v]=dis[u]+edge[i].w;
used[v]=1;
q.push(v);
}
}
}
return k;
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
char c;
int u,v,w;
memset(head,-1,sizeof(head));
t=0;
for(int i=0;i<m;i++)
{
scanf("%d %d %d %c",&u,&v,&w,&c);
add(u,v,w);
add(v,u,w);
}
ans=0;
int k=bfs(1);
ans=0;
k=bfs(k);
printf("%d\n",ans);
}
return 0;
}