【BZOJ3876】[AHOI2014&JSOI2014] 支线剧情(无源汇有上下界网络流)
大致题意: 有一张\(DAG\),经过每条边有一定时间,从\(1\)号点出发,随时可以返回\(1\)号点,求经过所有边的最短时间。
无源汇有上下界网络流
这是无源汇有上下界网络流的板子题。
可以先去看看这道题学习一下无源汇有上下界可行流的基本知识:【LOJ115】无源汇有上下界可行流。
我们对于题目中的每条边,在网络流图中连容量下界为\(1\)、容量上界为\(INF\)、代价为经过其时间的边。
对于除\(1\)号点外的每个点,在网络流图中将其向\(1\)连容量下界为\(0\)、上界为\(INF\)、代价为\(0\)的边。
然后,我们按照上面这题的套路处理一下建好网络流图。
接下来我们可以发现,这就是要求最小费用可行流。
那就把可行流中原本的最大流改成最小费用最大流即可。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 300
#define K 5000
#define INF 1e9
using namespace std;
int n;
template<int PS,int ES> class NetFlow//网络流
{
private:
#define add(x,y,f,c) (addE(x,y,f,c),addE(y,x,0,-c))
#define addE(x,y,f,c) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y,e[ee].F=f,e[ee].C=c)
#define El(x) ((((x)-1)^1)+1)
int Ct,S,T,ee,p[PS+5],lnk[PS+5],lst[PS+5],F[PS+5],C[PS+5],Iq[PS+5];queue<int> q;
struct edge {int to,nxt,F,C;}e[2*ES+5];
I bool SPFA()//SPFA找增广路
{
RI i,k;for(i=1;i<=n+2;++i) F[i]=C[i]=INF;C[S]=0,q.push(S),Iq[S]=1;
W(!q.empty())
{
for(Iq[k=q.front()]=0,q.pop(),i=lnk[k];i;i=e[i].nxt) e[i].F&&C[k]+e[i].C<C[e[i].to]&&
(
F[e[i].to]=min(F[k],e[i].F),C[e[i].to]=C[k]+e[i].C,lst[e[i].to]=i,
!Iq[e[i].to]&&(q.push(e[i].to),Iq[e[i].to]=1)
);
}return F[T]!=INF;
}
public:
I void Add(CI x,CI y,CI Mn,CI Mx,CI c) {add(x,y,Mx-Mn,c),p[x]-=Mn,p[y]+=Mn,Ct+=Mn*c;}//建边
I void Solve()
{
RI x;S=n+1,T=n+2;for(RI i=1;i<=n;++i) p[i]>0&&add(S,i,p[i],0),p[i]<0&&add(i,T,-p[i],0);//建边使其满足流量平衡
W(SPFA()) {Ct+=F[T]*C[T],x=T;W(x^S) e[lst[x]].F-=F[T],e[El(lst[x])].F+=F[T],x=e[El(lst[x])].to;}//跑最小费用最大流
printf("%d",Ct);//输出答案
}
};NetFlow<N+2,2*N+K> Fl;
int main()
{
RI i,x,y,z;for(scanf("%d",&n),i=1;i<=n;++i)
for(scanf("%d",&x);x;--x) scanf("%d%d",&y,&z),Fl.Add(i,y,1,INF,z);//对于边建边
for(i=2;i<=n;++i) Fl.Add(i,1,0,INF,0);return Fl.Solve(),0;//对于点建边
}
【BZOJ3876】[AHOI2014&JSOI2014] 支线剧情(无源汇有上下界网络流)的更多相关文章
- BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流
题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...
- BZOJ3876 [Ahoi2014&Jsoi2014]支线剧情 【有上下界费用流】
题目 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费最少 ...
- BZOJ3876[Ahoi2014&Jsoi2014]支线剧情——有上下界的最小费用最大流
题目描述 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费 ...
- bzoj3876: [Ahoi2014&Jsoi2014]支线剧情
题意:给一幅图,从1开始,每条边有边权最少走一遍,可以在任意点退出,问最小花费 题解:上下界费用流,每个边都流一遍,然后为了保证流量平衡,新建源点汇点,跑费用流把流量平衡 /************* ...
- bzoj3876: [Ahoi2014&Jsoi2014]支线剧情(上下界费用流)
传送门 一道题让我又要学可行流又要学zkw费用流…… 考虑一下,原题可以转化为一个有向图,每次走一条路径,把每一条边都至少覆盖一次,求最小代价 因为一条边每走过一次,就要付出一次代价 那不就是费用流了 ...
- Reactor Cooling(无源汇有上下界网络流)
194. Reactor Cooling time limit per test: 0.5 sec. memory limit per test: 65536 KB input: standard o ...
- HDU 4940 Destroy Transportation system(无源汇有上下界最大流)
看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...
- SGU 194. Reactor Cooling(无源汇有上下界的网络流)
时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...
- hdu 4940 无源汇有上下界最大流
/* <img src="http://img.blog.csdn.net/20140823174212937?watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
随机推荐
- 解决Fiddler在win7系统下的安全证书问题
如果电脑win7系统,一直解决不了Fiddler的证书安装问题,可以试试下面的办法. 在安装证书的时候一直遇到这个问题. 这是因为win7系统的在.net Framework4.0上面的bug引起的. ...
- git必知必会
1. Git 配置 --system #系统级别--global #用户全局--local #单独一个项目 git config --global user.name "xxxx" ...
- C语言--计算程序执行时间
C语言–计算程序执行时间1. gettimeofday精度1us #include<stdio.h>#include<sys/time.h> int main(){ /* 定义 ...
- 失败zero
1127 系统玩崩溃了 分区助手调整c盘,导致自动进入快速启动然后疯狂boot网卡检测?还有测试中心? 查找错误initialization and establishing link,结论是bios ...
- PHP框架 fastadmin 根据条件判断字段的显示隐藏
首先,因为fastadmin的JS里面字段不支持function函数 里面只能填false或true,不能动态判断显示隐藏, 后面通过看文档发现能在表格初始化的地方判断 如图,就可以实现根据lin ...
- eclipse强行停止buliding workspace
使用Eclipse的过程中可能会遇到buliding workspace卡在一半走不动的情况. 出现这个情况往往是因为Eclipse太调皮了,需要拉出去打屁股,打一顿就好了. 开玩笑的,事实上出现这个 ...
- Python入门36道经典练习题
[程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? num_list=[] cou=0 for i in range(1,5): for j in rang ...
- android studio 菜单中的app运行按钮上有个叉号,原因与解决办法(自己去百度)
http://blog.csdn.net/sz0268/article/details/51706397 : 在Android studio写代码中,直接建立项目,写代码然后运行是不会一般是不会出现这 ...
- 易优CMS:关于assign你知道多少
[基础用法] 名称:assign 功能:模板文件中定义变量,可在其他标签里使用该变量 语法: {eyou:assign name='typeid' value='5' /} 文件: 无 参数: nam ...
- 点击事件的坐标计算(client || offset) +(X || Width || Left) 各种排列组合别绕晕
结论: 1,X,Y的都是属于点击位置的,width.height.left.top都是属于DOM的. 2,涉及的所有位置只与document或DOM内部有关,与DOM如何定位,周围有没有其他占位HTM ...