您的位置:首页 > 其它

hdu 2196 Computer(树形DP)

2014-04-28 21:26 411 查看
题意:题目给出电脑连接的方式,求出每一台电脑和离它最远的电脑的距离。

解法:把图画出来,距离一个节点最长的距离有两种可能:第一种是从它的子节点到达该点的距离,第二种是通过它的父节点到达该点的距离。第二种情况分两种:如果该点不在其父节点的最长路径上,直接用其父节点的最长路径加上其父节点与该节点之间的距离。如果该点在其父节点的最长路径上,则用其父节点的次长路径加上该点到其父节点的距离。

刚开始学树形DP。

#include<stdio.h>
#include<string.h>
#define N 10005
struct node
{
int x,y;
int len;
int next;
} map[N*2];
struct point
{
int max;
int secMax;
} a
;
int head
,mark
;
int cnt;
void addEdge(int x,int y,int k)
{
map[cnt].x=x;
map[cnt].y=y;
map[cnt].len=k;
map[cnt].next=head[x];
head[x]=cnt++;
map[cnt].x=y;
map[cnt].y=x;
map[cnt].len=k;
map[cnt].next=head[y];
head[y]=cnt++;
return ;
}
int dfs(int f)
{
int u=head[f];
mark[f]=1;
while(u!=-1)
{
int k=map[u].y;
if(!mark[k])
{
int temp=dfs(k)+map[u].len;
if(temp>a[f].secMax) a[f].secMax=temp;
if(a[f].secMax>a[f].max) temp=a[f].max,a[f].max=a[f].secMax,a[f].secMax=temp;
}
u=map[u].next;
}
return a[f].max;
}
void DFS(int f)
{
int u=head[f];
mark[f]=1;
while(u!=-1)
{
int k=map[u].y;
if(!mark[k])
{
if(a[f].max!=a[k].max+map[u].len)
{
a[k].secMax=a[k].max;
a[k].max=a[f].max+map[u].len;
}
else
{
if(a[k].max<a[f].secMax+map[u].len)
{
a[k].secMax=a[k].max;
a[k].max=a[f].secMax+map[u].len;
}
else if(a[k].secMax<a[f].secMax+map[u].len)
a[k].secMax=a[f].secMax+map[u].len;
}
DFS(k);
}
u=map[u].next;
}
return ;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(head,-1,sizeof(head));
cnt=0;
for(int i=2; i<=n; i++)
{
int x,k;
scanf("%d%d",&x,&k);
addEdge(i,x,k);
}
memset(a,0,sizeof(a));
memset(mark,0,sizeof(mark));
dfs(1);
memset(mark,0,sizeof(mark));
DFS(1);
for(int i=1; i<=n; i++)
printf("%d\n",a[i].max);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: