HDU2196_Computer_求树上的每一个点可以达到的最大距离
作者:互联网
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int num=1e4+10;
struct node
{
int v,next,w;
}e[2*num];
int head[2*num],cnt;
int dp[num][2];
void int_i(void)
{
memset(dp,0,sizeof(dp));
memset(head,0,sizeof(head));
cnt=0;
return ;
}
void addedge(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
return ;
}
void dfs1(int u,int f)
{
int L=0,R=0;//L>=R
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v==f) continue;
dfs1(v,u);
if(dp[v][1]+e[i].w>=L)
{
swap(L,R);
L=dp[v][1]+e[i].w;
}
else if(dp[v][1]+e[i].w>R)
{
R=dp[v][1]+e[i].w;
}
}
dp[u][0]=R;
dp[u][1]=L;
return ;
}
void dfs2(int u,int f)//更新每个节点的dp[][0],dp[][1];
{
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v==f) continue;
int s;
s=(dp[v][1] + e[i].w ==dp[u][1])?0:1;
if(dp[u][s] + e[i].w >= dp[v][1])
{
swap(dp[v][0],dp[v][1]);
dp[v][1]=dp[u][s]+e[i].w;
}
else if(dp[u][s] + e[i].w > dp[v][0])
{
dp[v][0]=dp[u][s]+e[i].w;
}
dfs2(v,u);
}
return ;
}
int main()
{
int n,u,w;
while(scanf("%d",&n)!=EOF)
{
int_i();
for(int i=2;i<=n;i++)
{
scanf("%d%d",&u,&w);
addedge(u,i,w);
addedge(i,u,w);
}
dfs1(1,-1);
dfs2(1,-1);
for(int i=1;i<=n;i++)
printf("%d\n",max(dp[i][1],dp[i][0]));
}
return 0;
}
标签:head,一个点,int,void,HDU2196,cnt,num,Computer,dp 来源: https://blog.csdn.net/weixin_43596048/article/details/101073948