题意:求节点间的最大距离

先DFS一次 记录下 每一节点的子树下的最大距离(DP[ u ] [ 0 ])和第二大距离(DP[ u ] [ 1 ])

用DP[ v ] [ 2 ] 表示由v的父节点来的最大距离

再取DP[ u ] [ 0 ] 与 DP[ u ][ 2 ] 的最值

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <time.h>;
#define cler(arr, val) memset(arr, val, sizeof(arr))
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define IN freopen ("in.txt" , "r" , stdin);
#define OUT freopen ("out.txt" , "w" , stdout);
typedef long long LL;
const int MAXN = 10014;
const int MAXM = 20014;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
struct node
{
int v,next;
LL val;
} edge[MAXM];
int head[MAXM],tol;
LL dp[MAXN][3];
bool vis[MAXN];
void init()
{
cler(head,-1);
tol=0;
}
void addedge(int u,int v,LL val)
{
edge[tol].v=v,edge[tol].val=val,edge[tol].next=head[u];
head[u]=tol++;
edge[tol].v=u,edge[tol].val=val,edge[tol].next=head[v];
head[v]=tol++;
}
void dfs1(int u)
{
if(vis[u]) return ;
vis[u]=true;
for(int i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].v;
if(!vis[v])
{
dfs1(v);
dp[u][1]=max(dp[u][1],dp[v][0]+edge[i].val);
if(dp[u][1]>dp[u][0])swap(dp[u][1],dp[u][0]);
}
}
}
void dfs2(int u)
{
if(vis[u]) return ;
vis[u]=true;
for(int i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].v,val=edge[i].val;
if(!vis[v])
{
if(dp[u][0]>dp[v][0]+val)//dp[u][0]不是由dp[v][0]+val而来的
dp[v][2]=max(dp[v][2],max(dp[u][0]+val,dp[u][2]+val));//所以从非v子树来的更长
else //dp[u][0]由dp[v][0]+val而来的
dp[v][2]=max(dp[v][2],max(dp[u][1]+val,dp[u][2]+val));//推断非v子树来的哪个长
dfs2(v);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int n;
while(~scanf("%d",&n))
{
init();
for(int i=2; i<=n; i++)
{
int a;
LL b;
scanf("%d %I64d",&a ,&b );
addedge(i,a,b);
}
cler(vis,false);
cler(dp,0);
dfs1(1);
cler(vis,false);
dfs2(1);
for(int i=1;i<=n;i++)
printf("%I64d\n",max(dp[i][2],dp[i][0]));
} }

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

  1. fwt优化+树形DP HDU 5909

    //fwt优化+树形DP HDU 5909 //见官方题解 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ #include <bits/ ...

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

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

  3. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  4. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  5. HDU 2196 Computer (树dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...

  6. hdu 2196 Computer(树形DP)

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

  7. 题解报告:hdu 2196 Computer(树形dp)

    Problem Description A school bought the first computer some time ago(so this computer's id is 1). Du ...

  8. hdu 2196 Computer 树形dp模板题

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

  9. hdu 2196 Computer(树形DP经典)

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

  10. HDU 2196 Computer (树上最长路)【树形DP】

    <题目链接> 题目大意: 输出树上每个点到其它点的最大距离. 解题分析: 下面的做法是将树看成有向图的做法,计算最长路需要考虑几种情况. dp[i][0] : 表示以i为根的子树中的结点与 ...

随机推荐

  1. JDK8新特性:函数式接口

    一,定义 函数式接口,英文为Functional Interface.首先它是一个接口,那么它与其它接口有什么不同呢?不同点就是在这个接口中只允许有一个抽象方法. 这里的只允许一个抽象方法不包括以下几 ...

  2. GObject调用父类函数

    最近在分析Gstreamer的代码时,发现GstPipeline中有如下代码: result = GST_ELEMENT_CLASS (parent_class)->change_state ( ...

  3. Java中的命名规范到底是怎样的

    内容摘要:命名规范二,java中的方法名,对象名和字段名的第一个单词的首写字母应该小写,而后面的每个单词的首字母都应该小写 要想将java基础学的十分的牢固就必须将java中的命名规范掌握好了.俗话说 ...

  4. FTP协议讲解

    FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用.FTP的目标是提高文件的共享性和可靠高效地传送数据. 在传输文件时,FTP 客户端程序先与服务器建立连接 ...

  5. LeetCode Weekly Contest 18B

    1. 496. Next Greater Element I 暴力的话,复杂度也就1000 * 1000 = 1e6, 在1s的时限内完全可以. 当然,有许多优化方法,利用stack维护递减序列的方法 ...

  6. wolf

    package com.wh.Demo50; /** * @author 王恒 * @datetime 2017年4月7日 下午4:40:54 * @description * 分析:子类重写父类的方 ...

  7. unity3d 鼠标事件

    using UnityEngine; using System.Collections; public class mouse : MonoBehaviour { //private Vector3 ...

  8. MVP演化论

    本文是翻译MVP: Model-View-Presenter The Taligent Programming Model for C++ and Java(Mike Potel)文章的摘要.该文介绍 ...

  9. hdu2236 无题II 最大匹配 + 二分搜索

    中文题目,题意大家都明白. 看到“不同的行和列”就觉得要用二分匹配来做.要求最大值与最小值的差值最小,是通过枚举边的下限和上限来完成. 枚举过程是这样的,在输入的过程可以记录下边权的最大值MAX和最小 ...

  10. iOS中容易混淆的知识点(持续更新中)

    1.成员变量和属性的区别 @interface Person : NSObject { NSString *_sex; } @property (nonatomic, copy) NSString * ...