这道题是说给出了一个无环的无向连通图..问两点间的最长距离是多少..点很多..图只能用链表来记录~~
其实无环的无向图就是一颗树了..而最长路经必然是从一个叶子到另一个叶子..我开始直接暴力枚举每个点来DFS找最长路经~~结果不是TLE..而是WA了...不知所然..
后面参考了下discuss里的两次DFS方法...就是从任意点DFS一次..用这次DFS最远的点再DFS一次的最远距离则是答案..
至于原因也很好理解 ~~ 把图看成一棵树~~那么任意节点都可以是树的根~分几种情况来看最长路径可能的情况就明白了..
Program:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
struct node
{
int x,y,w,next;
}line[900005];
int _link[10005],m,n,x,y,z,ans;
bool used[10005];
void DFS1(int dis,int x)
{
if (dis>ans) { ans=dis; y=x; }
int k;
k=_link[x];
used[x]=true;
while (k)
{
if (!used[line[k].y]) DFS1(dis+line[k].w,line[k].y);
k=line[k].next;
}
return;
}
void DFS2(int dis,int x)
{
if (dis>ans) ans=dis;
int k;
k=_link[x];
used[x]=true;
while (k)
{
if (!used[line[k].y]) DFS1(dis+line[k].w,line[k].y);
k=line[k].next;
}
return;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
m=0; n=0;
memset(_link,0,sizeof(_link));
while (~scanf("%d%d%d",&x,&y,&z))
{
if (x>n) n=x;
if (y>n) n=y;
m++;
line[m].x=x; line[m].y=y; line[m].w=z;
line[m].next=_link[x]; _link[x]=m;
m++;
line[m].y=y; line[m].y=x; line[m].w=z;
line[m].next=_link[y]; _link[y]=m;
}
ans=0;
memset(used,false,sizeof(used));
y=1;
DFS1(0,1);
memset(used,false,sizeof(used));
DFS2(0,y);
printf("%d\n",ans);
return 0;
}