1. 程式人生 > >GRL_5_A Diameter of a Tree 樹的直徑(最遠點對)

GRL_5_A Diameter of a Tree 樹的直徑(最遠點對)

題意:

給出無向圖,求出樹的直徑

分析:

任選一個點,計算出距離這個點最遠的點x

從x出發找出距離x最遠的點y

則x-y即為所求。

#include<bits/stdc++.h>

using namespace std;

const int maxn=1e5+10;

#define inf 0x3f3f3f3f

int d[maxn],n;
struct node{
    int v,w;
    node(int v,int w):v(v),w(w){}
    node(){}
};

vector<node> g[maxn];

void bfs(int u){
    for(int i=0;i<n;i++) d[i]=inf;
    queue<int> q;
    q.push(u);
    d[u]=0;
    while(!q.empty()){
        u=q.front();q.pop();
        int len=g[u].size();
        for(int i=0;i<len;i++){
            if(d[g[u][i].v]==(int)inf){
                d[g[u][i].v]=d[u]+g[u][i].w;
                q.push(g[u][i].v);
            }
        }
    }
}

void solve(){
    bfs(0);
    int mx=0,t=0;
    for(int i=0;i<n;i++){
        if(d[i]==(int)inf) continue;
        if(mx<d[i]){
            mx=d[i],t=i;
        }
    }
    bfs(t);
    mx=0;
    for(int i=0;i<n;i++){
        if(d[i]==(int)inf) continue;
        mx = max(mx,d[i]);
    }
    printf("%d\n",mx);
}

int main(){
    int u,v,w;
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        scanf("%d%d%d",&u,&v,&w);
        g[u].push_back(node(v,w));
        g[v].push_back(node(u,w));
    }
    solve();
    return 0;
}