标签: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