Friday, November 2, 2012

Finding Tree Diameter


#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define siz 10010
const int infinity = 1000000000;
vector <int> vec[siz],cost[siz];
int d[siz];
char as[siz];
int mxNode,mx=0;

void bfs(int source){
    for(int i=0;i<=10000;i++) d[i]=infinity;
    queue <int> q;
    q.push(source);
    d[source]=0;

    while(!q.empty()){
        int u=q.front(); q.pop();
        int ucost=d[u];
        for(int i=0;i<vec[u].size();i++){
            int v=vec[u][i], vcost=cost[u][i]+ucost;
            if(d[v]>vcost){
                d[v]=vcost;
                if(vcost>mx){
                    mx=vcost;
                    mxNode=v;
                }
                q.push(v);
            }
        }
    }
}

void reset(){
    for(int i=0;i<=10000;i++){
        vec[i].clear();
        cost[i].clear();
    }
}
int main()
{
    int u,v,c,s,d,edge;
    //freopen("input.txt","r",stdin);
    while(scanf("%d",&edge)==1){
        mx=0;
        for(int i=0;i<edge;i++){
            scanf("%d%d%d",&u,&v,&c);
            vec[u].push_back(v);
            vec[v].push_back(u);
            cost[u].push_back(c);
            cost[v].push_back(c);
        }
        bfs(u);
        bfs(mxNode);
        printf("%d\n",mx);
        reset();
    }
    return 0;
}


No comments:

Post a Comment