题目链接:https://cn.vjudge.net/contest/277955#problem/B

题目大意:首先输入n代表有n个电脑,然后再输入n-1行,每一行输入两个数,t1,t2.代表第(i+1)个电脑连向电脑t1,花费是t2,然后问你每个电脑的到其他电脑的最大花费。

具体思路:按照图来想,对于节点2,最大的花费的路径可能有两种,第一种,往下遍历他的叶子节点找到最大的,第二种,先往上走,然后从往上走的节点再去找最大的花费。

对于第一种花费,我们直接dfs求就可以了。 但是在求的时候顺便求一下当前这个节点往下的第二大花费,具体作用是在第二种情况中会使用到。

对于第二种花费,我们先是往上移动,然后再去求他上面的点的最大花费,但是这个地方要注意一点,在往上面走的时候,求的最小花费可能会有路径重复,比如说三号节点,往上走的话是2号节点,而二号节点的最远距离有可能是2->3->4,这样的话,就会有一段路径重复计算。这个时候求的次小花费就能有用处了,既然我花费最大的用不了,那么我就用花费第二小的。

状态转移方程: 对于第二种情况,如果当前的节点的父亲节点的最大花费的路径中包括当前这个节点,这个时候我们就算上第二大的,然后再加上当前这个点到父亲节点的花费就可以了。否则就安最大花费计算。

AC代码:

 #include<iostream>
#include<cmath>
#include<stack>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
# define inf 0x3f3f3f3f
# define ll long long
const int maxn = 4e4+;
struct node
{
int nex;
int to;
int cost;
} edge[maxn];
int num,head[maxn],dp[maxn][],father[maxn];
void init()
{
num=;
memset(head,-,sizeof(head));
memset(dp,,sizeof(dp));
}
void addedge(int fr,int to,int cost)
{
edge[num].to=to;
edge[num].nex=head[fr];
edge[num].cost=cost;
head[fr]=num++;
}
void dfs1(int st,int rt)
{
for(int i=head[st]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(to==rt)
continue;
dfs1(to,st);
if(dp[to][]+edge[i].cost>dp[st][])
{
father[st]=to;// 这个地方要注意是谁是数组的下标,我们需要判断的是这个父亲节点的路径上是不是包括这个子节点。
dp[st][]=dp[st][];//记录次大的
dp[st][]=dp[to][]+edge[i].cost;
}
else if(dp[to][]+edge[i].cost>dp[st][])
{
dp[st][]=dp[to][]+edge[i].cost;
}
}
}
void dfs2(int st,int rt)
{
for(int i=head[st]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(to==rt)
continue;
if(father[st]==to)
{
dp[to][]=max(dp[st][],dp[st][])+edge[i].cost;
}
else
dp[to][]=max(dp[st][],dp[st][])+edge[i].cost;
dfs2(to,st);
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
init();
int t1,t2;
for(int i=; i<=n; i++)
{
scanf("%d %d",&t1,&t2);
addedge(i,t1,t2);
addedge(t1,i,t2);
}
dfs1(,-);
dfs2(,-);
for(int i=; i<=n; i++)
{
printf("%d\n",max(dp[i][],dp[i][]));
}
}
return ;
}

树形dp(B - Computer HDU - 2196 )的更多相关文章

  1. Computer HDU - 2196

    Computer HDU - 2196 A school bought the first computer some time ago(so this computer's id is 1). Du ...

  2. 动态规划(树形DP):HDU 5834 Magic boy Bi Luo with his excited tree

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8UAAAJbCAIAAABCS6G8AAAgAElEQVR4nOy9fXQcxZ0uXH/hc8i5N+

  3. 【树形dp】Computer

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. 动态规划(树形DP):HDU 5886 Tower Defence

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2MAAAERCAIAAAB5Jui9AAAgAElEQVR4nOy9a6wsS3YmFL/cEkh4LP

  5. 基础树形DP小结

    HDU 4044 Geodefense http://blog.csdn.net/zmx354/article/details/25109897 树形DP暂且先告一段落了. HDU 3586 Info ...

  6. 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】

    树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...

  7. 【DP_树形DP专题】题单总结

    转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...

  8. 树形DP题目集合

    [树形DP](https://cn.vjudge.net/contest/123963#overview) #include<cstdio> #include<string> ...

  9. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. ORACLE创建映射

    create synonym table_name for aa.table_name

  2. 【XSY1759】Alice and Bob

    Description XSY1759 Solution 肯定是离线对每个子树求答案. 考虑对每个子树建出所包含的值的Trie树,这点用启发式算法实现即可,即每个元素会被插入\(\mathcal O( ...

  3. 前端学习 -- Xhtml语法规范

    Xhtml语法规范 HTML中不区分大小写,但是尽量使用小写: HTML的注释不能嵌套: 标签必须结构完整{要么成对出现,要么自结束标签,虽然浏览器会帮我们修正一些不符合规范的内容} 标签可以嵌套但是 ...

  4. 解题:Poetize6 IncDec Sequence

    题面 差分原数列得到差分数组$dif$,这样对于$dif[2]->dif[n]$会多出来两个“空位置”$1$和$n+1$.然后区间加减就变成了使一个位置$+1$,另一个位置$-1$(可以对“空位 ...

  5. D. Huge Strings Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)

    http://codeforces.com/contest/868/problem/D 优化:两个串合并 原有状态+ 第一个串的尾部&第二个串的头部的状态 串变为第一个串的头部&第二个 ...

  6. 团体程序设计天梯赛 L2-016. 愿天下有情人都是失散多年的兄妹

    同时也要记录父母的性别,输出询问时要用到 #include <stdio.h> #include <stdlib.h> #include <string.h> #i ...

  7. RabbitMQ 运转流程

    生产者发送消息 1.生产者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel) 2.生产者声明一个交换器,并设置相关属性,比如交换机类型.是否持 ...

  8. python学习(23)requests库爬取猫眼电影排行信息

    本文介绍如何结合前面讲解的基本知识,采用requests,正则表达式,cookies结合起来,做一次实战,抓取猫眼电影排名信息. 用requests写一个基本的爬虫 排行信息大致如下图 网址链接为ht ...

  9. Python高手之路【七】python基础之模块

    本节大纲 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparse ...

  10. Zabbix应用四:Zabbix监控Nginx

    利用Zabbix监控Nginx 一.准备nginx监控模版: 1.1.下载nginx监控模版:  点此下载 1.2.导入模版: Zabbix管理页面,选择'配置'->'模版'->'导入': ...