POJ3585 Accumulation Degree (树形DP-二次扫描与换根)
本题属于不定根的树形DP,若以每个节点为根求解一次,复杂度太高,所以可以用换根的技巧。
d[u]表示以u为根向下可以流的最大流量,这个是比较好求的,直接遍历到叶子节点,由子节点信息更新父节点。然后进行第二次遍历,从上往下,子节点的信息由父节点更新。
这就是换根法的基本思路。
本题转移方程还是比较好想的,画图分析一下就行了。
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int MAXN=200200;
6 const int MAXE=400400;
7 const int INF=0x3f3f3f3f;
8 struct E{
9 int v,w,next;
10 }edge[MAXE];
11 int head[MAXN],cnt,dp[MAXN],d[MAXN],val[MAXN],deg[MAXN];
12 int n,T;
13
14 void add(int u,int v,int w){
15 edge[cnt].v=v;
16 edge[cnt].w=w;
17 edge[cnt].next=head[u];
18 head[u]=cnt++;
19 }
20
21 void dfs1(int u,int fa){
22 d[u]=0;
23 for(int i=head[u];~i;i=edge[i].next){
24 int v=edge[i].v;
25 if(v==fa) continue;
26 dfs1(v,u);
27 if(deg[v]==1) d[u]+=edge[i].w;
28 else d[u]+=min(d[v],edge[i].w);
29 }
30 }
31
32 void dfs2(int u,int fa){
33 for(int i=head[u];~i;i=edge[i].next){
34 int v=edge[i].v;
35 if(v==fa) continue;
36 if(deg[u]==1) dp[v]=d[v]+edge[i].w;
37 else dp[v]=d[v]+min(dp[u]-min(d[v],edge[i].w),edge[i].w);
38 dfs2(v,u);
39 }
40 }
41
42 void init(){
43 memset(head,-1,sizeof(head));
44 memset(d,0,sizeof(d));
45 memset(dp,0,sizeof(dp));
46 memset(deg,0,sizeof(deg));
47 cnt=0;
48 }
49
50 int main(){
51 scanf("%d",&T);
52 while(T--){
53 scanf("%d",&n);
54 init();
55 for(int i=1;i<n;i++){
56 int u,v,w;
57 scanf("%d%d%d",&u,&v,&w);
58 add(u,v,w);
59 add(v,u,w);
60 deg[u]++;
61 deg[v]++;
62 }
63 dfs1(1,0);
64 dp[1]=d[1];
65 dfs2(1,0);
66 int ans=0;
67 for(int i=1;i<=n;i++)
68 ans=max(ans,dp[i]);
69 printf("%d\n",ans);
70 }
71 return 0;
72 }
POJ3585 Accumulation Degree (树形DP-二次扫描与换根)的更多相关文章
- $Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法
Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发 ...
- poj3585 树形dp 二次扫描,换根法模板题
#include<iostream> #include<cstring> #include<cstdio> #include<vector> using ...
- poj3585 Accumulation Degree(树形dp,换根)
题意: 给你一棵n个顶点的树,有n-1条边,每一条边有一个容量z,表示x点到y点最多能通过z容量的水. 你可以任意选择一个点,然后从这个点倒水,然后水会经过一些边流到叶节点从而流出.问你最多你能倒多少 ...
- poj3585 Accumulation Degree[树形DP换根]
思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移 ...
- 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)
写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换 ...
- poj 3585 Accumulation Degree(二次扫描和换根法)
Accumulation Degree 大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总 ...
- [LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)
Solution: 由于 \[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \] 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或 ...
- 【POJ3585】Accumulation Degree 二次扫描与换根法
简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...
- POJ3585 Accumulation Degree(二次扫描与换根法)
题目:http://poj.org/problem?id=3585 很容易想出暴力.那么就先扫一遍. 然后得到了指定一个根后每个点的子树值. 怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前 ...
- 【51Nod1405】树上距离和 二次扫描与换根法
题目大意:给定一棵 N 个点的边权均为 1 的树,依次输出每个点到其他各个点的距离和. 题解:首先任意选定一个节点为根节点,比如 1,第一遍 dfs 遍历树求出子树大小.树上前缀和.第二遍 dfs 遍 ...
随机推荐
- python打开文件、文件夹窗口、终端窗口
简介 在一些项目中,我们会需要在生成完文件后打开某些文件或者文件夹窗口,这就需要使用到内置的文件打开方式了. 打开文件或文件夹 Windows import os import subprocess ...
- 20220724-Java的继承
目录 含义 代码示例 使用方法和注意事项 个人理解 含义 继承Extends 面向对象最显著的一个特性,继承是从已有的类中派生出新的类,新的类能吸收已有类的性和方法,并能扩展新的能力. 代码示例 cl ...
- 20220716-Markdown语法学习
目录 1.标题部分 2.目录 3.字体部分 4.引用 5.列表 6.代码块 7.表格 8.脚注 9.水平线 效果: 10.引用链接 11.URLs 12.图片 13.emoji 效果: 14.html ...
- LevelSequence源码分析
前言 这篇文章主要讲的是Unreal LevelSequence RunTime的部分.即在游戏中运行Level Sequence的源码解析.(而且抛去Replicated 的Sequence,一般S ...
- 张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器
时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题.古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间.随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一 ...
- s905l3a系列刷armbian 教你从0搭建自己的博客
最近服务器又更换了,原来的有一点点小意外(一个电阻给我焊接时搞掉了). 哎~~今天,我淘到了一个好东西----CM311-3a,配置很诱人,价格也不贵,60绰绰有余 比较 CM311-3a N1(炒到 ...
- 封装Fraction-分数类(C++)
Fraction 分数类 默认假分数,可自行修改 由于concept的原因 template <typename T> concept is_float_v = std::is_float ...
- Apache DolphinScheduler 1.3.8 发布
小伙伴们 Apache DolphinScheduler 1.3.8 发布 2021年9月7日,正式发布 在 1.3.8 版本中,我们在 Docker&k8s 这里做了许多优化,Docker ...
- WebGPU的计算着色器实现冒泡排序
大家好~本文使用WebGPU的计算着色器,实现了奇偶排序. 奇偶排序是冒泡排序的并行版本,在1996年由J Kornerup提出.它解除了每轮冒泡间的串行依赖以及每轮冒泡内部的串行依赖,使得冒泡操作可 ...
- BZOJ4337 树的同构 (树哈希)(未完成)
样例迷,没过 交了30pts #include <cstdio> #include <iostream> #include <cstring> #include & ...