您的位置:首页 > 其它

hdu2196

2016-03-06 15:59 246 查看
链接:点击打开链接

题意:求一棵树中每个节点距离其它节点的最大距离

代码:

#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int to,cost;
};
vector<node> G[10005];
int n,dp[10005],vis[10005],dis[10005][5];
void dfs1(int s){
int i,tmp;
for(i=0;i<G[s].size();i++){
tmp=G[s][i].to;
if(G[tmp].size())
dfs1(tmp);
if(dis[tmp][0]+G[s][i].cost>dis[s][0]){
dis[s][0]=dis[tmp][0]+G[s][i].cost;
vis[s]=tmp;
}
}
for(i=0;i<G[s].size();i++){
tmp=G[s][i].to;
if(tmp!=vis[s])
dis[s][1]=max(dis[s][1],dis[tmp][0]+G[s][i].cost);
}
}                                               //从下向上更新最长距离
void dfs2(int s){
int i,tmp;
for(i=0;i<G[s].size();i++){
tmp=G[s][i].to;
if(tmp==vis[s])                         //判断是否在父节点的最长路径上
dp[tmp]=max(dp[s],dis[s][1])+G[s][i].cost;
else
dp[tmp]=max(dp[s],dis[s][0])+G[s][i].cost;
dfs2(tmp);
}
}                                               //从上向下跟新最长距离
int main(){                                     //距离当前节点最远的点无非是向下找或者向上找
int i,j,x,y;                                //因此向下找最长距离就用一次dfs,向上找的最长
while(scanf("%d",&n)!=EOF){                 //距离需要判断需要判断是否在当前父节点的最长路
memset(dp,0,sizeof(dp));                //径上,如果在则向上的最长距离为父节点的次长距
memset(dis,0,sizeof(dis));              //离加上两点的距离,否则为父节点的最长距离加上
memset(vis,0,sizeof(vis));              //两点的距离
for(i=1;i<=n;i++)
G[i].clear();
for(i=2;i<=n;i++){
scanf("%d%d",&x,&y);
G[x].push_back((node){i,y});        //建树
}
dfs1(1);
dfs2(1);
for(i=1;i<=n;i++)
printf("%d\n",max(dis[i][0],dp[i]));    //比较向下的距离和向上的距离
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: