在这道题中,题意要求我们求出每一个结点到最远端的距离,那么我们知道一棵树中树的直径两端距离是最远的,那么树中的每一个结点到这直径的其中一个端点距离是最远的
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int sz=10004;
int vis[sz],dis[sz],dis1[sz],dis2[sz],val[300],head[sz];
int n,k,cnt,fa,len;
struct node
{
int v,next,len;
}tree[2*sz];
void add(int u,int v,int ll)
{
cnt++;
tree[cnt].v=v;
tree[cnt].len=ll;
tree[cnt].next=head[u];
head[u]=cnt;
}
void dfs(int u,int pr,int ds[],int ll)
{
int i,v;
for(i=head[u];i!=-1;i=tree[i].next)
{
v=tree[i].v;
if(v==pr)continue;
ds[v]=ll+tree[i].len;
if(ds[v]>len)
{
len=ds[v];
fa=v;
}
dfs(v,u,ds,ds[v]);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
cnt=0;
memset(head,-1,sizeof(head));
memset(dis,0,sizeof(dis));
memset(dis1,0,sizeof(dis1));
memset(dis2,0,sizeof(dis2));
int i;
for(i=2;i<=n;i++)
{
int a,b;
scanf("%d %d",&a,&b);
add(i,a,b);
add(a,i,b);
}
len=0;
dfs(1,-1,dis,0);//找树的一个最远端结点
len=0;
dfs(fa,-1,dis1,0);//每一结点到这个点的距离同时找到另一个直径端点
len=0;
dfs(fa,-1,dis2,0);//每一个结点到这个点的距离
for(i=1;i<=n;i++)
printf("%d\n",max(dis1[i],dis2[i]));
}
return 0;
}
树形dp代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int sz=10004;
struct node
{
int v,next,len;
}tree[2*sz];
int Max[sz],Smax[sz],Mnode[sz],Snode[sz],head[sz],cnt;
void init()
{
memset(Max,0,sizeof(Max));;
memset(Smax,0,sizeof(Smax));
memset(head,-1,sizeof(head));
}
void add(int u,int v,int len)
{
tree[cnt].v=v;
tree[cnt].next=head[u];
tree[cnt].len=len;
head[u]=cnt;
cnt++;
}
void dfs1(int u,int fa)
{
int i,v,len;
for(i=head[u];i!=-1;i=tree[i].next)
{
v=tree[i].v;
len=tree[i].len;
if(v==fa) continue;
dfs1(v,u);
if(Smax[u]<Max[v]+len)
{
Smax[u]=Max[v]+len;
Snode[u]=v;
if(Max[u]<Smax[u])
{
int t;
t=Smax[u];
Smax[u]=Max[u];
Max[u]=t;
t=Snode[u];
Snode[u]=Mnode[u];
Mnode[u]=t;
}
}
}
}
void dfs2(int u,int fa)
{
int i,v,len;
for(i=head[u];i!=-1;i=tree[i].next)
{
v=tree[i].v;
len=tree[i].len;
if(v==fa) continue;
if(v==Mnode[u])
{
if(Smax[u]+len>Smax[v])
{
Smax[v]=Smax[u]+len;
Snode[v]=u;
if(Max[v]<Smax[v])
{
int t;
t=Smax[v];
Smax[v]=Max[v];
Max[v]=t;
t=Mnode[v];
Mnode[v]=Snode[v];
Snode[v]=t;
}
}
}
else
{
if(Max[u]+len>Smax[v])
{
Smax[v]=Max[u]+len;
Snode[v]=u;
if(Max[v]<Smax[v])
{
int t;
t=Smax[v];
Smax[v]=Max[v];
Max[v]=t;
t=Mnode[v];
Mnode[v]=Snode[v];
Snode[v]=t;
}
}
}
dfs2(v,u);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
init();
cnt=1;
int i,a,b;
for(i=2;i<=n;i++)
{
scanf("%d %d",&a,&b);
add(i,a,b);
add(a,i,b);
}
dfs1(1,-1);
dfs2(1,-1);
for(i=1;i<=n;i++)
printf("%d\n",Max[i]);
}
return 0;
}