poj3585 树形dp 二次扫描,换根法模板题
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
#define maxn 200005 struct Edge{
int to,next,c;
}edge[maxn<<];
int dp[maxn],f[maxn],vis[maxn],degree[maxn],head[maxn],tot;
void addedge(int u,int v,int c){
edge[tot].to=v;
edge[tot].c=c;
edge[tot].next=head[u];
head[u]=tot;
tot++;
} void DP(int u){
vis[u]=;dp[u]=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(vis[v]) continue;
DP(v);
if(degree[v]==) dp[u]+=edge[i].c;//分两种情况,叶子节点和非叶子结点
else dp[u]+=min(edge[i].c,dp[v]);
}
}
void dfs(int u){
vis[u]=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(vis[v]) continue;
if(degree[u]==)//分两种情况
f[v]=dp[v]+edge[i].c;//u只有v一个子节点
else
f[v]=dp[v]+min(edge[i].c,f[u]-min(dp[v],edge[i].c));//除了v外的其他节点
dfs(v);
}
}
int main(){
int t,u,v,c,n;
scanf("%d",&t);
while(t--){
memset(head,-,sizeof head);
memset(degree,,sizeof degree);
tot=;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d%d%d",&u,&v,&c);
addedge(u,v,c);
addedge(v,u,c);
degree[u]++,degree[v]++;
} int root=,ans=;
memset(vis,,sizeof vis);
DP(root);
f[root]=dp[root];
memset(vis,,sizeof vis);
dfs(root);
for(int i=;i<=n;i++)
ans=max(ans,f[i]);
printf("%d\n",ans);
}
}
poj3585 树形dp 二次扫描,换根法模板题的更多相关文章
- $Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法
Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发 ...
- 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)
写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换 ...
- poj 3585 Accumulation Degree(二次扫描和换根法)
Accumulation Degree 大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总 ...
- poj3585树最大流——换根法
题目:http://poj.org/problem?id=3585 二次扫描与换根法,一次dfs求出以某个节点为根的相关值,再dfs遍历一遍树,根据之前的值换根取最大值为答案. 代码如下: #incl ...
- cf219d 基础换根法
/*树形dp换根法*/ #include<bits/stdc++.h> using namespace std; #define maxn 200005 ]; int root,n,s,t ...
- UVA 10859 Placing Lamppost 树形DP+二目标最优解的求解方案
题意:给定一个无向,无环,无多重边,要求找出最少的若干点,使得,每条边之中至少有一个点上有街灯.在满足上述条件的时候将还需要满足让两个点被选择的边的数量尽量多. 题解: 对于如何求解最小的节点数目这点 ...
- POJ - 3585 树上最大流 换根法
题意:给出一棵树,边上有容量限制,求以任一点作为根和源点,叶子作为汇点的最大流的最大值 首先上网络流等于找死 树形DP可以\(O(n)\)求出以某点\(u\)为根的最大流,只需设\(f[u]=\sum ...
- 【POJ3585】Accumulation Degree 二次扫描与换根法
简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...
- POJ3585 Accumulation Degree(二次扫描与换根法)
题目:http://poj.org/problem?id=3585 很容易想出暴力.那么就先扫一遍. 然后得到了指定一个根后每个点的子树值. 怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前 ...
随机推荐
- JavaScript中的number跟string
遇到问题困扰很久,因为这看起来木有问题,都是对的啊,殊不知是因为参数需要一个数字类型,但是数据却悄悄变成了字符类型.在群里求救无果最后自己找到了原因. 为什么我箭头里放数字可以正常显示,放temp[i ...
- C# 实现立体图形变换(vs2008)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- WebStrom设置默认浏览器
- 淘淘商城之Ajax跨域请求
一.什么是跨域 (1)域名不同时: (2)域名相同,端口不同时 二.解决方法 可以使用jsonp解决跨域问题 三.什么是jsonp jsonp其实是一个跨域解决方案,js跨域请求数据是不允许的,但是跨 ...
- C# 简单的反射机制实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- Linux - svn 操作
--force # 强制覆盖 /usr/bin/svn --username user --password passwd co $Code ${SvnPath}src/ # 检出整个项目 /usr/ ...
- JavaScript之Dom操作【删除当前节点】
//最新更新:2017-11-25 //现在可以通过更强大而快捷的方式为所有的HTMLElement元素的Dom操作扩展新的方法[注意事项:处理HTMLElemnt元素时,此法对IE-8无效] //原 ...
- MacOs -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
1解决iterm远程登录主机报错 -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or ...
- _vimrc(VimScript脚本语言学习)
Windows下 syntax on "高亮 "缩进 set cindent "set cin set smartindent "set si set auto ...
- mysql 架构~多写模式MGR
一 简介:今天咱们来聊聊MGR的单主切换和新节点加入二 单主模式下变成多主: 1 3306 STOP group_replication; set global group_replicati ...