试题 算法提高 树的直径(dfs)
问题描述
树的直径
输入格式
输入的第一行包含一个整数n,表示树中的点数。接下来n-1行,每行3个正整数,表示连同的两点及边的权值。
输出格式
输出1行,包含一个整数,表示树的直径。
样例输入
7
1 2 1
1 3 1
2 4 1
3 5 1
4 7 1
4 6 1
1 2 1
1 3 1
2 4 1
3 5 1
4 7 1
4 6 1
样例输出
5
数据规模和约定
n<10^5
思路
两次dfs,任意一个点dfs到最深处的点,再用此点去dfs即得到树的直径。
和这道题一样。试题 历届试题 大臣的旅费(求树的直径,两次dfs)
#include<bits/stdc++.h> using namespace std; vector<pair<int,int> >v[100005]; int vis[100005]; int maxx=-1,c; void dfs(int m,int sum){ if(sum>maxx){ maxx=sum; c=m; } vis[m]=1; for(int i=0;i<v[m].size();i++){ if(!vis[v[m][i].first]){ vis[v[m][i].first]=1; dfs(v[m][i].first,sum+v[m][i].second); vis[v[m][i].first]=0; } } } int main(){ int n,u,e,cost;cin>>n; for(int i=0;i<n-1;i++){ cin>>u>>e>>cost; v[u].push_back(make_pair(e,cost)); v[e].push_back(make_pair(u,cost)); } dfs(u,0); maxx=-1; memset(vis,0,sizeof(vis)); dfs(c,0); cout<<maxx<<endl; return 0; }