Computer(HDU2196+树形dp+树的直径)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196
题目:
题意:有n台电脑,每台电脑连接其他电脑,第i行(包括第一行的n)连接u,长度为w,问你每个节点能够连接的最远距离。
思路:树形dp,由于本题是一棵有根树(根节点为1),所以每个节点能到达的最远距离为max(从父亲节点往上传并到达根节点的其他子树的最远距离,从子节点到达的最远距离)。为了获得这两个信息,那么我们就需要把信息从子节点往父亲节点传和从父亲节点往子节点传,因此我们需要两个dfs,第一个处理出当前节点u从子节点能够到达的最远距离(记为dp[u][0]),次远距离(记为dp[u][1]),第二个处理从父亲节点能够到达的最远距离(记为dp[u][2]),最后每个节点能够到达的最远距离就是max(dp[u][0],dp[u][2])。我们为什么要记录dp[u][1]呢?原因是当你在第二遍dfs时,你记录dp[u][2]就得判断是dp[u][0]和dp[u][2]比较还是dp[u][1]和dp[u][2]比较(当前节点为v,v的父亲节点为u),而这个判断的依据就是u从子节点到达的最远距离是否就是通过跑v这条子链跑出来的,如果是跑这条链跑出来的,那么肯定是要用dp[u][1]来进行比较,反之就是dp[u][0]。(实在不好理解的请手动画个图辅助理解~)我们知道树的直径是树上最长链的长度,根据这题处理出来的信息我们容易知道树的直径就是max{max(dp[u][0],dp[u][2])+dp[u][0],u为1~n}。
代码实现如下:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef unsigned long long ull; #define bug printf("*********\n");
#define FIN freopen("in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const int mod = 1e9 + ;
const int maxn = 1e4 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f; int n, u, v;
int dp[maxn][]; struct edge {
int v, w;
edge(int v = , int w = ) : v(v), w(w) {}
}; vector<edge> G[maxn]; void init() {
memset(dp, , sizeof(dp));
for(int i = ; i < maxn; i++) {
G[i].clear();
}
} void dfs1(int u) {
int v, w;
for(int i = ; i < G[u].size(); i++) {
v = G[u][i].v, w = G[u][i].w;
dfs1(v);
if(dp[v][] + w > dp[u][]) {
dp[u][] = max(dp[u][], dp[u][]);
dp[u][] = dp[v][] + w;
} else {
dp[u][] = max(dp[u][], dp[v][] + w);
}
}
} void dfs2(int u) {
int v, w;
for(int i = ; i < G[u].size(); i++) {
v = G[u][i].v, w = G[u][i].w;
if(dp[u][] == dp[v][] + w) {
dp[v][] = max(dp[u][], dp[u][]) + w;
} else {
dp[v][] = max(dp[u][], dp[u][]) + w;
}
dfs2(v);
}
} int main() {
//FIN;
while(~scanf("%d", &n)) {
init();
for(int i = ; i <= n; i++) {
scanf("%d%d", &u, &v);
G[u].push_back(edge(i, v));
}
dfs1();
dfs2();
for(int i = ; i <= n; i++) {
printf("%d\n", max(dp[i][], dp[i][]));
}
}
return ;
}
Computer(HDU2196+树形dp+树的直径)的更多相关文章
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- computer(树形dp || 树的直径)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 4607 树形dp 树的直径
题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ...
- VIJOS1476旅游规划[树形DP 树的直径]
描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...
- POJ 3162.Walking Race 树形dp 树的直径
Walking Race Time Limit: 10000MS Memory Limit: 131072K Total Submissions: 4123 Accepted: 1029 Ca ...
- poj3162 树形dp|树的直径 + 双单调队列|线段树,好题啊
题解链接:https://blog.csdn.net/shiqi_614/article/details/8105149 用树形dp是超时的,, /* 先求出每个点可以跑的最长距离dp[i][0|1] ...
- hdu-2169 Computer(树形dp+树的直径)
题目链接: Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
随机推荐
- lintcode-181-将整数A转换为B
181-将整数A转换为B 如果要将整数A转换为B,需要改变多少个bit位? 注意事项 Both n and m are 32-bit integers. 样例 如把31转换为14,需要改变2个bit位 ...
- TCP系列01—概述及协议头格式
一.TCP简单介绍 我们经常听人说TCP是一个面向连接的(connection-oriented).可靠的(reliable).字节流式(byte stream)传输协议, TCP的这三个特性该怎么 ...
- JDK源码分析 – LinkedList
LinkedList类的申明 public class LinkedList<E> extends AbstractSequentialList<E> implements L ...
- 如何设置windows 2003的最大远程连接数
在Windows 2003系统上的远程桌面实际上就是终端服务,虽然远程桌面最初在Windows XP上就已经存在,但由于Windows XP的远程桌面功能,只能提供一个用户使用计算机,因此使用率并不高 ...
- Linux环境PHP5.6升级7.1.8
PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂 ...
- C# Parsing 类实现的 PDF 文件分析器
下载示例 下载源代码 1. 介绍 这个项目让你可以去读取并解析一个PDF文件,并将其内部结构展示出来. PDF文件的格式标准文档可以从Adobe那儿获取到. 这个项目基于“PDF指南,第六版,Adob ...
- 【bzoj3312】[Usaco2013 Nov]No Change 状态压缩dp+二分
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- 【刷题】BZOJ 2038 [2009国家集训队]小Z的袜子(hose)
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...
- [SP8372-TSUM]Triple Sums
题面在这里 description 某\(B\)姓\(OJ\)权限题 给出\(n\)个正整数\(a[i]\),求\(i<j<k\)且\(S=a[i]+a[j]+a[k]\)的三元组\((i ...
- 2018牛客多校第六场 G.Pikachu
题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...