HDU 2196 树的直径

来源:互联网 发布:dotamax周报怎么看数据 编辑:程序博客网 时间:2024/04/28 07:52

到树上的任意节点最远的点一定是树的两个端点之一

要注意bfs判断端点的时候不能再用记最后出队元素的方法 

因为边权是给定的 不一定为1

#include<algorithm>#include<stdio.h>#include<iostream>#include<vector>#include<queue>#define maxn 10005using namespace std;#define inf 1000000005vector<int>G[maxn];int vis[maxn];int d1[maxn],d2[maxn];int s,n;struct Edge{    int from,to,va;};vector<Edge>edges;void AddEdge(int from,int to,int va){    edges.push_back((Edge){from,to,va});    edges.push_back((Edge){to,from,va});    int k =(int)edges.size();    G[from].push_back(k-2);    G[to].push_back(k-1);}void bfs(int *d,int &s){    for(int i=1;i<=n;++i)    {        d[i]=-1;        vis[i]=0;    }    queue<int>q;    q.push(s);    vis[s]=1;    d[s]=0;        while(!q.empty())    {          int k=q.front();           q.pop();        if(d[s]<d[k])s=k;     //因为边权不一定为1 所以最后出队的元素不一定是端点                for(int i=0;i<G[k].size();++i)        {            Edge &x=edges[G[k][i]];                     if(vis[x.to])continue;               d[x.to]=d[k]+x.va;                      vis[x.to]=1;                q.push(x.to);        }    }}int main(){    while(~scanf("%d",&n))    {        memset(d1,0,sizeof d1);        memset(d2,0,sizeof d2);        int a,va;        for(int i=2;i<=n;++i)        {            scanf("%d%d",&a,&va);            AddEdge(i,a,va);        }        int t=1;        bfs(d1,t);        bfs(d1,t);        bfs(d2,t);        for(int i=1;i<=n;++i)        {printf("%d\n",max(d1[i],d2[i]));}        for(int i=0;i<=n;++i)        {G[i].clear();}         edges.clear();    }    return 0;}


0 0
原创粉丝点击