链接:http://poj.org/problem?id=1985
题意:题目阐述不是很清楚,是一棵严格树,不存在环,求其中两点间距离最长一处。
思路:两点间距离最长即为树的直径。易得,从任意点开始DFS找到距离最长一点一定是距离最长两点之一,再从找到的点再DFS一次就可以找到数的直径。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 50005
#define maxm 100005
#define INF 1<<25
#define MAX 0x7fffffff
typedef long long ll;
using namespace std;
struct Edge
{
int v,w;
int next;
}edge[maxm];
int tot,tt;
int point[maxn];
int vv[maxn],dis[maxn];
int top=1,d;
int init()
{
top=1;
memset(edge,0,sizeof(edge));
memset(point,0,sizeof(point));
memset(vv,0,sizeof(vv));
memset(dis,0,sizeof(dis));
d=0;
}
int add_edge(int u,int v,int w)
{
edge[top].v=v;
edge[top].w=w;
edge[top].next=point[u];
point[u]=top++;
edge[top].v=u;
edge[top].w=w;
edge[top].next=point[v];
point[v]=top++;
return 0;
}
int dfs(int x)
{
vv[x]=1;
for(int i=point[x];i!=0;i=edge[i].next)
{
if(!vv[edge[i].v])
{
d+=edge[i].w;
dis[edge[i].v]=d;
dfs(edge[i].v);
d-=edge[i].w;
}
}
}
int main()
{
scanf("%d%d",&tot,&tt);
init();
for(int i=0;i<tt;i++)
{
int x,y,z;
char ss[3];
scanf("%d%d%d%s",&x,&y,&z,ss);
add_edge(x,y,z);
}
dfs(1);
int aa=0,bb;
for(int i=1;i<=tot;i++)
{
if(dis[i]>aa)
{
bb=i;
aa=dis[i];
}
}
memset(dis,0,sizeof(dis));
memset(vv,0,sizeof(vv));
dfs(bb);
aa=0;
d=0;
for(int i=1;i<=tot;i++)
{
if(dis[i]>aa)
{
bb=i;
aa=dis[i];
}
}
printf("%d\n",aa);
}