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. 当better-scroll遇见了react擦出的火花

    关于better-scroll这个插件前面已经介绍过两次了 从原生js使用到结合服务端发送数据使用都有过介绍 今天给大家分享一下这款插件在react中遇见的坑  总之我真是对这款插件又爱又恨 每次各种 ...

  2. 消息点击率翻倍的背后——闲鱼无侵入可扩展IFTTT系统

    一.面临问题 在闲鱼生态里,用户之间会有很多种关系.其中大部分关系是由买家触发,联系到卖家,比如买家通过搜索.收藏.聊天等动作与卖家产生联系:另外一部分是平台与用户之间的关系.对这些关系分析之后我们发 ...

  3. @雅礼集训01/10 - T1@ matrix

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个矩阵.求它的所有子矩阵中本质不同的行的个数之和. inp ...

  4. jQuery对html元素的取值与赋值实例详解

    jQuery对html元素的取值与赋值实例详解 转载  2015-12-18   作者:欢欢   我要评论 这篇文章主要介绍了jQuery对html元素的取值与赋值,较为详细的分析了jQuery针对常 ...

  5. 详解TableStore模糊查询——以订单场景为例

    背景 订单系统在各行各业中广泛应用,为消费者.商家后台.促销系统等第三方提供用户.产品.订单等多维度的管理和查询服务.为了挖掘出海量订单数据的潜能,丰富高效的查询必不可少.然而很多时候并不能给出完整准 ...

  6. 第25章 Pytorch 如何高效使用GPU

    第25章 Pytorch 如何高效使用GPU 深度学习涉及很多向量或多矩阵运算,如矩阵相乘.矩阵相加.矩阵-向量乘法等.深层模型的算法,如BP,Auto-Encoder,CNN等,都可以写成矩阵运算的 ...

  7. Python--day62--ORM的使用

    4.Django里ORM的使用 1,手动创建数据库 2,在settings.py里面,配置数据库的连接信息 3,在项目/__init__.py告诉Django用pymysql模块代替MySQLdb(不 ...

  8. python基础十一之迭代器和生成器

    可迭代 内置方法中含有__iter__的数据类型都是可迭代的,只要是可迭代的就可以使用for循环,反之亦然. print(dir('')) # dir()函数可以获取当前数据类型的所有内置方法 返回值 ...

  9. java IO的概述和File方法

    IO流用来处理设备之间的数据传输        Java对数据的操作是通过流的方式        Java用于操作流的对象都在IO包中 File类在整个IO包中与文件本身有关的操作类,所有的与文件本身 ...

  10. java 标准流

    标准输入流:  System.in   默认表示的是键盘录入    标准输出流:  System.out  默认表示的是屏幕输出 Eg: package june6D; import java.io. ...