标签:
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4440 Accepted Submission(s):
2236
#include<stdio.h> #include<string.h> #include<queue> #define MAX 40100 #define maxn(x,y)(x>y?x:y) using namespace std; int head[MAX]; int vis[MAX],dis[MAX]; int n,m,ans,ant; int sum,beg,en; int a[MAX],b[MAX]; struct node { int u,v,w; int next; }edge[MAX]; void add(int u,int v,int w) { edge[ans].u=u; edge[ans].v=v; edge[ans].w=w; edge[ans].next=head[u]; head[u]=ans++; } void getmap() { int i,j,a,b; ans=0; memset(head,-1,sizeof(head)); for(i=2;i<=n;i++) { scanf("%d%d",&a,&b); add(a,i,b); add(i,a,b); } } void bfs(int sx) { int i,j; queue<int>q; sum=0; memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis)); vis[sx]=1; beg=sx; q.push(sx); while(!q.empty()) { int top=q.front(); q.pop(); for(i=head[top];i!=-1;i=edge[i].next) { int k=edge[i].v; if(!vis[k]) { vis[k]=1; dis[k]=dis[top]+edge[i].w; q.push(k); } if(sum<dis[k]) { sum=dis[k]; beg=k; } } } } void solve() { int i,j; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); bfs(1); bfs(beg); en=beg;//找到第一个端点 for(i=1;i<=n;i++) a[i]=dis[i];//记录每个点到这个端点的距离 bfs(en);//找到另一个端点 for(i=1;i<=n;i++) b[i]=dis[i];//记录每个点到这个端点的距离 for(i=1;i<=n;i++) { ant=0; ant=maxn(a[i],b[i]); printf("%d\n",ant); } } int main() { while(scanf("%d",&n)!=EOF) { getmap(); solve(); } return 0; }
hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4739710.html