hdu 2196 Computer(树形DP)
2014-04-28 21:26
411 查看
题意:题目给出电脑连接的方式,求出每一台电脑和离它最远的电脑的距离。
解法:把图画出来,距离一个节点最长的距离有两种可能:第一种是从它的子节点到达该点的距离,第二种是通过它的父节点到达该点的距离。第二种情况分两种:如果该点不在其父节点的最长路径上,直接用其父节点的最长路径加上其父节点与该节点之间的距离。如果该点在其父节点的最长路径上,则用其父节点的次长路径加上该点到其父节点的距离。
刚开始学树形DP。
解法:把图画出来,距离一个节点最长的距离有两种可能:第一种是从它的子节点到达该点的距离,第二种是通过它的父节点到达该点的距离。第二种情况分两种:如果该点不在其父节点的最长路径上,直接用其父节点的最长路径加上其父节点与该节点之间的距离。如果该点在其父节点的最长路径上,则用其父节点的次长路径加上该点到其父节点的距离。
刚开始学树形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; }
相关文章推荐
- HDU - 2196 Computer 【树形dp必做题?】
- Hdu 2196 Computer(树形dp)
- Computer - HDU 2196 树形dp
- hdu 2196 Computer(树形dp)
- HDU 2196 Computer 树形DP 经典题
- hdu 2196 Computer(经典树形DP)
- hdu 2196 Computer(树形DP)
- hdu 2196 Computer 树形dp模板题
- hdu 2196 Computer(树形dp)
- HDU 2196 Computer(树形DP)
- HDU 2196--Computer(树形dp)
- [HDU 2196] Computer (树形dp)
- HDU 2196 Computer(树形dp 求结点到叶子的最远距离)
- HDU 2196-Computer(经典树形DP)
- hdu 2196 computer (树形dp)
- HDU 2196 Computer(树形dp)
- hdu 2196 Computer 树形dp模板题
- HDU 2196 Computer(经典树形DP)
- hdu 2196 computer(树形dp)
- hdu 2196 Computer 树形DP 求每个点的最远点距离 两次dfs的经典树形dp