题意:给出各个农场之间的距离,问你两个农场之间的最长距离是多少。
看到是和噩梦导航有联系的,我一开始就以为还是LCA的问题,我把1986的程序改了一下,结果TLE,所以还是另辟它法,我们知道最远的两个农场一定会在叶子结点之间。假设 不在叶子结点,那么它还可以往下走到叶子结点求出最大,这点我也考虑到,在用LCA的时候我用标志位标志了还是超时了。所以两次DFS就好了。
代码:
#include<iostream> #include<vector> #define maxn 100005 using namespace std; struct node { int v,w; node(int x,int y):v(x),w(y){} }; int n; vector<node> e[maxn]; bool visit[maxn]; int ans,p; void DFS(int u,int dis) { if(dis>ans) ans=dis,p=u; visit[u]=1; for(int i=0;i<e[u].size();i++){ int v=e[u][i].v; if( !visit[v]) DFS(v,dis+e[u][i].w); } } int main() { int m,a,b,c; scanf("%d%d",&n,&m); while( m--){ scanf("%d%d%d %*c",&a,&b,&c); e[a].push_back(node(b,c)); e[b].push_back(node(a,c)); } ans=0, p=0; memset(visit,0,sizeof(visit)); DFS(1,0); ans=0; memset(visit,0,sizeof(visit)); DFS(p,0); printf("%d\n",ans); }