题目链接:  HDU 2196 Computer

分析:   先从任意一点开始, 求出它到其它点的最大距离, 然后以该点为中心更新它的邻点,

再用被更新的点去更新邻点......依此递推 !

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip> using namespace std;
const int inf = 0x7FFFFFFF;
const int maxn = 11111; struct node{
int to, dix, sum;
node *next;
}tree[maxn<<1], *head[maxn]; int ptr, n;
bool vis[maxn];
int dp[maxn],h[maxn]; void Init(){
ptr=1;
memset(dp,0,sizeof(dp));
memset(vis,false,sizeof(vis));
memset(head,0,sizeof(head));
} void AddEdge(int x,int y,int s){
tree[ptr].dix=s;
tree[ptr].to=y;
tree[ptr].next=head[x];
head[x]=&tree[ptr++];
} void DFS(int cnt){
vis[cnt]=true;
node *p=head[cnt];
while(p!=NULL){
if(vis[p->to]) {
p=p->next; continue;
}
DFS(p->to);
dp[cnt]=max(dp[cnt],dp[p->to]+p->dix);
p->sum=dp[p->to]+p->dix;
p=p->next;
}
} void Tree_Dp(int father, int son){
if(vis[son]) return ;
vis[son]=true;
int Max=0;
node* p=head[father];
while(p!=NULL){
if(p->to!=son)
Max=max(Max,p->sum);
p=p->next;
}
p=head[son];
while(p!=NULL){
if(p->to==father){
p->sum=p->dix+Max; break;
}
p=p->next;
}
p=head[son];
while(p!=NULL){
dp[son]=max(dp[son],p->sum);
Tree_Dp(son,p->to);
p=p->next;
}
}
int main(){
while(~scanf("%d",&n)&&n){
Init();
for(int i=2;i<=n;++i){
int a,b; scanf("%d%d",&a,&b);
AddEdge(a,i,b);
AddEdge(i,a,b);
} DFS(1); ///得到1点到其它所有点的距离 memset(vis,false,sizeof(vis));
node* p=head[1];
while(p!=NULL){ ///从1的邻点开始更新
Tree_Dp(1,p->to);
p=p->next;
}
for(int i=1;i<=n;++i)
printf("%d\n",dp[i]);
}
return 0;
}

HDU 2196 树形DP Computer的更多相关文章

  1. HDU 2196树形DP(2个方向)

    HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...

  2. hdu 2196 树形dp

    思路:先求以1为根时,每个节点到子节点的最大长度.然后再次从1进入进行更新. #include<iostream> #include<cstring> #include< ...

  3. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  4. HDU 1520 树形dp裸题

    1.HDU 1520  Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...

  5. HDU 1561 树形DP入门

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. HDU 1520 树形DP入门

    HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...

  7. codevs 1380/HDU 1520 树形dp

    1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 回到问题 题目描述 Description Ural大学有N个职员 ...

  8. HDU 5834 [树形dp]

    /* 题意:n个点组成的树,点和边都有权值,当第一次访问某个点的时候获得利益为点的权值 每次经过一条边,丢失利益为边的权值.问从第i个点出发,获得的利益最大是多少. 输入: 测试样例组数T n n个数 ...

  9. hdu 4267 树形DP

    思路:先dfs一下,找出1,n间的路径长度和价值,回溯时将该路径长度和价值清零.那么对剩下的图就可以直接树形dp求解了. #include<iostream> #include<al ...

随机推荐

  1. linux的fork函数

       fork函数  头文件:#include<unistd.h> 函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include< ...

  2. json序列化后日期如何变回来

    日期格式为 日期小于10的时候 占一位 比如 2019年9月1日 2015/9/1 function ChangeDateFormat(cellval) {           var date = ...

  3. asp.net中Timer定时器在web中无刷新的使用

    最近在做一个项目的时候,web端的数据需要与数据源进行实时同步,并保证数据的准确性,当时,考虑到使用ajax异步刷新技术.但后来在网上查找相关资料时,发现这样做,太浪费资源了,因为ajax的提交请求不 ...

  4. javascript mvc

    http://www.webjx.com/javascript/jsajax-15996.html http://blog.csdn.net/jjfat/article/details/7963608 ...

  5. 《转》SQL Server 2008 数据维护实务

    SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...

  6. [转贴]WebService的简单实现 C++

    WebService的简单实现 一.socket主机创建和使用过程 1.socket()//创建套接字 2.Setsockopt()//将套接字属性设置为允许和特定地点绑定 3.Bind()//将套接 ...

  7. 【Xamarin挖墙脚系列:配置Mac之间的连接问题】

    原文:[Xamarin挖墙脚系列:配置Mac之间的连接问题] 首先建议把MAC的防火墙关掉,呵呵, 其次,去设置里,允许所有用户远程登录连接MAC

  8. Android Training精要(七)内存管理

    在2.3.3及以下版本: 通過定義兩個整形變量來檢測bitmap是否display過或者已經在緩存中 下面的代碼當bitmap滿足兩個條件就被回收掉: 1. 兩個整形變量都變為0 2. bitmap不 ...

  9. perl 监控数据库用到的数据结构

    [root@yun1 test]# cat a1.pl my $h={'192.168.11.187'=>['root','1234567'], '192.168.5.7' =>['roo ...

  10. Python正则匹配多行,多个数据

    最近用Python做一个crawler工具的时候,发现用一个正则表达式可以匹配到个数据的时候用match.group()只能打印出第一个数据,其它数据不能打印出来.最后找到解决方法,现在记录一下,直接 ...