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; }