Poj

Description

有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发源地,可以源源不断地流出水,为源点.树中度为1的点是入海口,可以吸收无限多的水,为汇点.待整个水系稳定时,每条河道中的水都以单位时间固定的水量流向固定的方向.整个水系的流量就定义为源点单位时间发出的水量.

求哪个点作为源点时,整个水系的流量最大.

Sol

最朴素的做法就是枚举源点,再树形DP,更新答案.复杂度是O(n2)的,不能接受.

推想:某点为源点时的流量可以由其他点为源点时的流量推出

d[x]表示x的度,f1[x]表示以x为根的树的最大流量,f2[x]表示以x为源点时水系的最大流量,y是x的子结点

首先任意选取一个点作为源点(root),一次树形DP算出所有的f1[x]

具体的转移: if(d[y]==1)f1[x]+=c(x,y)  else f1[x]+=min(f1[y],c(x,y))

现在已知f2[x],可以推出f2[y]:

f2[y]包括两个部分:

1.流向x,(没错x由父变子hhh),这部分的流量:

if(d[x]==1) 为c(x,y)  else 为f2[x]-min(f1[y],c(x,y))

2.流向原来就是它的子结点的点,这部分的流量就是f1[y]

over!

Code

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define Rg register
#define il inline
#define mem(a,b) memset(a,b,sizeof(a));
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int T,n,ans,d[N],f1[N],f2[N];
bool vis[N];
struct node{int y,w;};
vector<node> c[N];
il void init()
{
ans=;
mem(vis,);mem(d,);mem(f1,);mem(f2,);
go(i,,n)c[i].clear();
}
il void dp1(int x)
{
vis[x]=;
int hhh=c[x].size()-;
go(i,,hhh)
{
int y=c[x][i].y,w=c[x][i].w;
if(vis[y])continue;
dp1(y);
if(d[y]==)f1[x]+=w;
else f1[x]+=min(f1[y],w);
}
}
il void dp2(int x)
{
vis[x]=;
int hhh=c[x].size()-;if(hhh<)return;
go(i,,hhh)
{
int y=c[x][i].y,w=c[x][i].w;
if(vis[y])continue;
if(d[x]==)f2[y]=f1[y]+w;
else f2[y]=f1[y]+min(f2[x]-min(f1[y],w),w);
dp2(y);
}
}
int main()
{
T=read();
while(T--)
{
n=read();init();
go(i,,n-)
{
int x=read(),y=read(),z=read();
c[x].push_back((node){y,z});c[y].push_back((node){x,z});
++d[x],++d[y];
}
dp1();
f2[]=f1[];mem(vis,);
dp2();
go(i,,n)ans=max(ans,f2[i]);
printf("%d\n",ans);
}
return ;
}

随机推荐

  1. 自定义View系列教程03--onLayout源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  2. day7_python之面向对象高级-反射

    反射:通过字符串去找到真实的属性,然后去进行操作 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 1.两种方法访问对象的属性 cl ...

  3. H3C用Telnet登录

  4. iphone开发中调用系统打电话功能

    iphone开发中调用打电话功能,一般有2种: 1.系统的打电话代码,不返回当前程序: Java代码 [[UIApplication sharedApplication] openURL:[NSURL ...

  5. 神经网络入门——6and感知机

    AND 感知器练习       AND 感知器的权重和偏置项是什么? 把权重(weight1, weight2)和偏置项 bias 设置成正确的值,使得 AND 可以实现上图中的运算.   在这个例子 ...

  6. URL的转义和解析

    在开始python编程之前我们先来看看一个关与url的知识 在url中会有一些特殊字符,如果你写过cgi程序,并且提交一个表单去调用你的cgi,你会很清楚的 像?name=aiqier&age ...

  7. ras 加解密类,支持截取

    class RsaEncrypt{ private $_privateKey = false; private $_publicKey = false; /** * 私钥解密 * @param $da ...

  8. 洛谷P4136 谁能赢呢? 题解 博弈论

    题目链接:https://www.luogu.org/problem/P4136 找规律 首先这道题目我没有什么思路,所以一开始想到的是通过搜索来枚举 \(n\) 比较小的时候的情况. 所以我开搜索枚 ...

  9. 在SuperSocket中启用TLS/SSL传输层加密

    关键字: TLS, SSL, 传输层加密, 传输层安全, 证书使用, X509Certificate SuperSocket 支持传输层加密(TLS/SSL) SuperSocket 有自动的对TLS ...

  10. Mule自带例子之flight-reservation

    1 配置效果图 2 应用的配置文件 <?xml version="1.0" encoding="UTF-8"?> <mule xmlns:sc ...