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 ...
随机推荐
- CSS——标准盒子模型
在写网页的时候一般都先用Div把网页的框架搭好(用不同的背景颜色来区分不同的Div块),然后填充每一个Div,最后把每个Div的背景颜色去掉 <html> <head> < ...
- 用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式(转)
做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel ...
- ubuntu下没有Language Support
sudo apt-get installlanguage-selector-gnome
- Animation鱼眼效果
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- Centos7上部署openstack ocata配置详解
之前写过一篇<openstack mitaka 配置详解>然而最近使用发现阿里不再提供m版本的源,所以最近又开始学习ocata版本,并进行总结,写下如下文档 OpenStack ocata ...
- bzoj1650
题解: 二分答案 然后贪心 代码: #include<bits/stdc++.h> using namespace std; ; int n,m,l,a[N]; int pd(int x) ...
- 《Python》 面向对象初识
一.面向对象初识: 1.结构上理解:类由两部分组成 class A: # class是类的关键字,类名首字母默认大写 name = 'alex' # 静态属性,静态变量,静态字段 def func ...
- 关于Predynastic Egypt
游戏界面(资源增加工人,工人产生资源) 解锁建筑(花费资源增加某一地区产出) 神灵祭祀(献祭资源获得临时buff,如减少建筑时间,一定回合内减少入侵几率,增加粮食产出,减少消耗资源等) 解锁科技(增加 ...
- 2019.1.7 EDVT measurement III
Frequency Accuracy SpecificationFor IEEE 802.11a 17.3.9.4 ± 20ppm MaximumFor IEEE 802.11b 18.4.7.4± ...
- Windows系统80端口被占用
1.查看系统端口被占用情况, 执行命令netstat -ano ,可以查看到被占用的端口对于的PID. 2. 打开任务管理器,然后点击“查看”→“选择PID”,勾上PID,再按PID排序,即可以看到8 ...