1. 程式人生 > 實用技巧 >試題 演算法提高 樹的直徑(dfs)

試題 演算法提高 樹的直徑(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 樣例輸出 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; }