POJ3585 Accumulation Degree(二次扫描与换根法)
题目:http://poj.org/problem?id=3585
很容易想出暴力。那么就先扫一遍。
然后得到了指定一个根后每个点的子树值。
怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前点的其他子树值 ” 就好了。
发现只需要把父亲的值减去 min ( 当前子树的值,该点与父亲间的边的值 ) 就行了!(因为当初这样加过)
需要注意一下的是叶节点。赋成INF或边的值都行。
特别需要注意的是第一次选的根节点在其余时候是叶节点的情况!!!!!
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,n,xnt,head[],rd[],x,y,z,yt;
const int INF=;
long long d[],ans;
struct Node{
int next,to;
long long w;
}edge[];
void add(int x,int y,int z)
{
edge[++xnt].next=head[x];
edge[xnt].to=y;
edge[xnt].w=z;
head[x]=xnt;
rd[x]++;
}
void dfs1(int k,int fa)
{
if(rd[k]==&&k!=yt)
{
d[k]=INF;
return;
}
for(int i=head[k];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa)continue;
dfs1(v,k);
d[k]+=min(d[v],edge[i].w);
// printf("1 k=%d d=%lld\n",k,d[k]);
}
}
void dfs2(int k,int fa,int u)
{
long long r=d[fa]-min(d[k],edge[u].w);
if(rd[fa]==)r=edge[u].w;///////////////当根节点也是叶节点时!很特殊
if(rd[k]==)
{
d[k]=min(r,edge[u].w);
return;
}
d[k]+=min(r,edge[u].w);
// printf("2 k=%d d=%lld\n",k,d[k]);
for(int i=head[k];i;i=edge[i].next)
{
if(edge[i].to==fa)continue;
dfs2(edge[i].to,k,i);
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(head,,sizeof head);
memset(d,,sizeof d);
memset(rd,,sizeof rd);
xnt=;ans=-;///////
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
yt=;
dfs1(,);
for(int i=head[];i;i=edge[i].next)
dfs2(edge[i].to,,i);
for(int i=;i<=n;i++)ans=max(ans,d[i]);
printf("%lld\n",ans);
}
return ;
}
POJ3585 Accumulation Degree(二次扫描与换根法)的更多相关文章
- 【POJ3585】Accumulation Degree 二次扫描与换根法
简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...
- poj3585 树形dp 二次扫描,换根法模板题
#include<iostream> #include<cstring> #include<cstdio> #include<vector> using ...
- 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)
写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换 ...
- poj 3585 Accumulation Degree(二次扫描和换根法)
Accumulation Degree 大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总 ...
- $Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法
Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发 ...
- 【51Nod1405】树上距离和 二次扫描与换根法
题目大意:给定一棵 N 个点的边权均为 1 的树,依次输出每个点到其他各个点的距离和. 题解:首先任意选定一个节点为根节点,比如 1,第一遍 dfs 遍历树求出子树大小.树上前缀和.第二遍 dfs 遍 ...
- poj - 3585(二次扫描与换根法)
周末牛客挂了个更难的,这个简单一些 #include<iostream> #include<cstring> #include<cstdio> #include&l ...
- [LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)
Solution: 由于 \[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \] 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或 ...
- poj3585 Accumulation Degree【树形DP】【最大流】
Accumulation Degree Time Limit: 5000MS Memory Limit: 65536K Total Submissions:3151 Accepted: 783 ...
随机推荐
- Visual Sudio 2012转换界面风格
点击“工具”--->"选项"--->“环境”--->“常规”将Color theme由你的“Light”改为“Dark”,即可成为黑色的界面
- shiro工作过程
http://blog.csdn.net/mine_song/article/details/61616259 什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用 ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(一)
跟我一起学习ASP.NET 4.5 MVC4.0(一) 由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最 ...
- bzoj1081
题解: 先暴力找规律 然后就一加一减的枚举 代码: #include<bits/stdc++.h> using namespace std; ],p[]; int main() { sca ...
- 【转载】oracle索引详解2
原文URL:http://justplayoop1.iteye.com/blog/1259562 一. 索引介绍 1.1 索引的创建 语法 : CREATE UNIUQE | BITMAP INDE ...
- selenium安装后,需要安装浏览器驱动
google的驱动:chromedriver.exe 驱动版本与chrome版本对应的目录: http://npm.taobao.org/mirrors/chromedriver/2.32/notes ...
- 使用存储过程非常慢,但是直接执行SQL很快
使用存储过程非常慢,但是直接执行SQL很快. 了解基本情况后,初步判断是参数嗅探问题 在对应的SQL语句后面使用 OPTION(OPTIMIZE FOR UNKNOWN) 参考了 http://www ...
- ASP.NET下跨应用共享Session和使用Redis进行Session托管
在之前的博客中,我说到了Session的共享问题,其中说到了Web Farm和Web Garden两种情况下Session的处理.在ASP.NET提供的Session处理方法中,有以下四种模式: 1. ...
- grafana设置Alert阈值和邮件报警
首先我们需要在机器上开启smtp/25服务,这里有一个坑,注意,云主机为了防止滥发邮件已经封掉了smtp的所有通信,所以云主机发邮件是有问题的. 安装sendmail,ubuntu用apt,cento ...
- nginx -s stop and -s quit 有什么区别?
Quit is a graceful shutdown. Nginx finishes serving the open connections before shutdown Quit 是一个优雅的 ...