POJ1985 求树的直径,从任意点出发DFS到最远的点u 再从u出发DFS到最远的点v ( u,v)即是树的直径。

算法证明用反证法可以轻松证出。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int maxn=100000;
vector<int>road[maxn];
int a[maxn],b[maxn],l[maxn];
bool vis[maxn];
long long int ans,now,tj;
void dfs(int np,int len)
{
 if(vis[np])return ;
 vis[np]=true;
 if(len>now){now=len;tj=np;}
 for(int i=0;i<road[np].size();i++)
 	{
 	 int ne=road[np][i];
 	 int next;
 	 if(a[ne]==np)next=b[ne];
 	 	else next=a[ne];
 	 dfs(next,len+l[ne]);
	}
}
int main()
{freopen("t.txt","r",stdin);
 ios::sync_with_stdio(false);
 int n,m;
 cin>>n>>m;
 memset(vis,0,sizeof(vis));
 for(int i=0;i<m;i++)
 	{
 	 int aa,bb,ll;
 	 char c;
 	 cin>>aa>>bb>>ll>>c;
 	 a[i]=aa;b[i]=bb;l[i]=ll;
 	 road[aa].push_back(i);road[bb].push_back(i);
	}
 ans=0;
 now=0;
 tj=1;
 memset(vis,0,sizeof(vis));
 
 dfs(1,0);
 memset(vis,0,sizeof(vis));
 dfs(tj,0);
 cout<<now<<endl;
 return 0;
}

  

posted on 2017-02-15 02:08  Bingsen  阅读(203)  评论(0编辑  收藏  举报