試題 演算法提高 樹的直徑(dfs)
阿新 • • 發佈:2020-08-29
問題描述
樹的直徑
輸入格式
輸入的第一行包含一個整數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)
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; }