标签:des style http color os io for art
5 1 1 2 1 3 1 1 1
3 2 3 4 4
告诉你一棵树,问你某个点最远能到达多远?
解题思路:
解题代码:先从1号点出发,找出各个点到1号点的距离,最远的那个点必然是树的主枝干上的一点。
从树的主干上的那点出发,距离最远的另一点必然是树主枝干的另一点。
接下来的答案就是每个点到两个主干点的距离取大。
#include <iostream>
#include <cstdio>
#include <climits>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=11000;
struct edge{
int u,v,w;
int next;
edge(int u0=0,int v0=0,int w0=0){ u=u0;v=v0;w=w0;}
}e[maxn*2];
int n,cnt,head[maxn],d[maxn],dx[maxn],dy[maxn];
void initial(){
cnt=0;
for(int i=0;i<=n;i++) head[i]=-1;
}
void addedge(int u,int v,int w){
e[cnt]=edge(u,v,w);e[cnt].next=head[u];head[u]=cnt++;
}
void input(){
int x,y,w0;
for(int i=2;i<=n;i++){
scanf("%d%d",&y,&w0);
addedge(i,y,w0);
addedge(y,i,w0);
}
}
void dfs(int u,int fa,int dis,int *d){
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(v!=fa) dfs(v,u,d[v]=dis+w,d);
}
}
void solve(){
int x=1,y=1;
dfs(1,-1,d[1]=0,d);
for(int i=1;i<=n;i++) if(d[x]<d[i]) x=i;
dfs(x,-1,dx[x]=0,dx);
for(int i=1;i<=n;i++) if(dx[y]<dx[i]) y=i;
dfs(y,-1,dy[y]=0,dy);
for(int i=1;i<=n;i++) d[i]=max(dx[i],dy[i]);
for(int i=1;i<=n;i++) printf("%d\n",d[i]);
}
int main(){
while(scanf("%d",&n)!=EOF){
initial();
input();
solve();
}
return 0;
}
POJ 2196 Computer(搜索-深度优先搜索),布布扣,bubuko.com
标签:des style http color os io for art
原文地址:http://blog.csdn.net/a1061747415/article/details/38421139