试题 算法提高 树的直径(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即得到树的直径。
#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;
}

 

posted @ 2020-08-29 13:22  mohari  阅读(196)  评论(0编辑  收藏  举报