求一棵树的直径。
方法:
随便选一个点当做root,开始DFS找到最远的一个点,这个点一定是树直径中的一个端点(严格树,不存在环)
然后再把刚才找到的点作为ROOT 第二遍DFS,这次找到的最远的距离,就是树的直径。
| Time Limit: 2000MS | Memory Limit: 30000K | |
| Total Submissions: 2963 | Accepted: 1484 | |
| Case Time Limit: 1000MS | ||
Description
Input
Output
Sample Input
7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S
Sample Output
52
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 500000
struct edge
{
int to,dis,next;
}e[9999999];
int head[MAXN],en;
int dis[MAXN];
void add(int u,int v ,int w)
{
e[en].to=v;
e[en].dis=w;
e[en].next=head[u];
head[u]=en++;
}
void dfs(int f,int u,int d)
{
dis[u]=d;
for(int i=head[u];i!=-1;i=e[i].next)
if(e[i].to!=f)
dfs(u,e[i].to,d+e[i].dis);
}
int u,v,c;
int n,m;
char s[20];
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(head,-1,sizeof(head));
en=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%s",&u,&v,&c,s);
add(u,v,c);
add(v,u,c);
}
dfs(0,1,0);
int maxs,tag;
maxs=-1;tag=0;
for(int i=1;i<=n;i++)
{
if(maxs<dis[i])
{
maxs=dis[i];
tag=i;
}
}
dfs(0,tag,0);
maxs=-1;
for(int i=1;i<=n;i++)
maxs=max(maxs,dis[i]);
printf("%d\n",maxs);
}
return 0;
}
1439




被折叠的 条评论
为什么被折叠?



