POJ 1149 PIGS
#include #include #include #include #include #include #include #include #include #include
View Code
POJ 2699 The Maximum Number of Strong Kings
分析:枚举strong king的个数,然后网络流判断是否可行。
#include #include #include #include #include #include #include #include #include #include
View Code
ZOJ 2760 How Many Shortest Path
分析:求出那些边可以存在于最短路上,然后跑网络流。
#include #include #include #include #include #include #include #include #include #include
View Code
WOJ 124 Football match
题意:
有 N 支球队,互相之间已经进行了一些比赛,还剩下M场没有比。现在给出各 支球队目前的总分以及还剩下哪 M 场没有比,问能否合理安排这 M 场比赛的结 果,使得第 N 支球队最后的总分大于其他任何一支球队的总分。已知每场比赛 胜者得 2 分,败者 0 分,平局则各得 1 分。(1 <= N <= 100, 0 <= M <= 1000)
分析:首先让所有n参见的比赛,让n赢,然后剩下的建图跑最大流,判断是否可行。S向每个比赛连,流量为2,每个比赛向两个球队连,流量为2,每个球队向T连,流量为w[n]-w[i]-1,表示最大的得分。
#include #include #include #include #include #include #include #include #include #include
View Code
SGU 438. The Glorious Karlutka River =)
题意:一条宽为W的河,河中有N块石头,每块石头的坐标(Xi, Yi)和每一时刻最大承受人数Ci。有M个游客,每次最远跳D米,每跳一次1秒。问能否所有人穿越这条河流,如果能,最少需要多长时间。 N,M<=50
分析:动态流问题,首先可以通过判断是否联通来得知能否过河(或者利用最差清空的时间是n+m来判断)。然后按时间拆点,建图跑网络流。每个石头拆成两个点,然后对于一条边u,v,从上一秒的u到下一秒的v连一条inf的边,每秒源点也要连出边。
#include #include #include #include #include #include #include #include #include #include
View Code
SPOJ NETADMIN - Smart Network Administrator
分析: 二分一个mid,然后给每条边设置容量为mid,从源点向每个想要链接internet的用户连一条容量为1的边,从1向汇点连一条容量为k的边。
#include #include #include #include #include #include #include #include #include #include
View Code
SPOJ IM - Intergalactic Map
题意:无向图中,能否从1走到2,再从2走到3,每个点只经过一次。
分析:源点向2连,容量为2,1和3向汇点连,容量为1,建图跑网络流,判断容量是否为2。
#include #include #include #include #include #include #include #include #include #include
View Code
POJ 1637 Sightseeing tour
题意:混合图欧拉回路的判定。
分析:首先给无向图随便定向,然后判断每个点的初度-入度有没有奇数,如有有,无解。否则S向出>入的点连,容量为(出-入)/2,入>出的点向T连,容量为(入-出)/2,原图中的无向边保留,有向边删掉,跑最大流,有解的条件是满流。
理解:每个的点度数之差如果是奇数,无论怎么改变无向边的方向,这个点的度数之差始终是奇数,所以无解;否则可以尝试着修改一些无向边的方向,使得每个点的出度等于入度。那么在网络中,如果一个点x的出度>入度,那么说明这个点需要改变一些出边变成入边,来满足条件,改变的条数是c=(出-入)/2;如果点y的入度>出度,那么就是改变入边,条数d=(入-出)/2。S向x连一条容量为c的边,y向T连一条容量为d的边。网络流中的一条增广路径经过的边,就是需要反转的边,如果满流,说明存在解。
代码:
#include #include #include #include #include #include #include #include #include #include
View Code
2756: [SCOI2012]奇怪的游戏
分析:黑白染色,讨论,网络流判断。
#include #include #include #include #include #include #include #include #include #include
View Code
UVA 11082 Matrix Decompressing
分析:经典问题,行列拆成一个点,S->行点,容量为行的和,列点->T,容量为列的和,中间两两连边,注意一下,原题中不能有0,权值范围为[1,20],因为所有边的容量一样,可以同时减去1(注意S->行,列->T的边也要减),然后求出后统一+1。
#include #include #include #include #include #include #include #include #include #include
View Code
1927: [Sdoi2010]星际竞速
分析:首先注意到这是一个DAG,每个点要保证只经过一次,可以从任意点出发。类似一个哈密顿回路(如果把瞬移也加入到图中的话)。考虑一个点是从哪里来的,可以从任意点直接瞬移到这里,可以从连向这个点的点走到这里。
1、那么由于从任意点瞬移到这个点的花费是一定的,所以可以直接从S->i+n(这些点设为i+n)连边,花费为瞬移的时间,容量为1。
2、从连向这个点的位置走过来,花费为路径的权值,由于这是一个类似哈密顿路径的东西,每个点也只能出去一次,所以再建一列点(i),表示从每个点出去,S->i,容量为1(表示这个点只能出去一次),花费为0;对于一条边u->v,连边u->v+n,容量为1,花费为边权。
3、u+n->T连边,容量为1,花费为0。u+n表示已经到过u这个点了,容量为1,表示只能由一个点到这个点(哈密顿路径中,要求出度入度都为1)。
#include #include #include #include #include #include #include #include #include #include
View Code
2324: [ZJOI2011]营救皮卡丘
分析:费用流,建模。首先转化为有向图无环图(DAG)的最小权路径覆盖问题,预处理出g[i][j],表示i->j只经过编号小于j或者i的点,最短路。然后就是一张n*n的竞赛图了(有向),选小于等于k条路径,覆盖所有点,花费最小。S->0,容量为k,花费为0,S-1~n,容量为1,花费为0;对于u->v,连接u->v+n,容量为1,花费为g[i][j];连接i+n->T,容量为1,花费为0。
#include #include #include #include #include #include #include #include #include #include
View Code
CF 277 E. Binary Tree on Plane
分析:每个点拆成两个点,一个表示作为父节点(i),另一个表示作为子节点(i+n)。然后S向i连边,容量为2(表示只能选两个子节点),花费为0;i+n向T连边容量为1,花费为0;如果i可以作为j的父节点,那么i向j+n连边,容量为1,花费为i与j之间的距离。
如果存在解,那么跑完最小费用最大流后,流量要求大于等于n-1。
#include #include #include #include #include #include #include #include #include #include
View Code
2879: [Noi2012]美食节
分析:费用提前计算。考虑第i分菜被第j个厨师做,这是他的第k份,一共做了t份,那么这份菜的花费就是(t-k+1)*T[i][j]。由于t是未知的,这样建图还是不太行,换种方法:考虑这个厨师倒数第k份菜是那个,那么它的花费就是k*T[i][j]。所以可以这样建图:每个厨师拆成sum_p个点,S向每个点连边,容量为1费用为0;每个点向每份菜连边,容量为1费用为T[i][j];每份菜向T连边,容量为p[i]费用为0。这样的话,边太多了,考虑优化,动态加边,每次增广会找到一条从S->厨师(倒数第i时刻的第j个厨师)->菜->T,因为时刻越靠前花费越多,所以一定会先找大的时刻,所以可以一开始加出所有的倒数第一个时刻的厨师,然后每次增广了一条路,找到这个厨师,把这个厨师的下一个时刻建出。
// luogu-judger-enable-o2#include #include #include #include #include #include #include #include #include #include
View Code
HDU 3667 Transportation
分析:每条边差分后拆成5条,分别是a,3a,5a,7a,9a。然后最小费用最大流。
#include #include #include #include #include #include #include #include #include #include
View Code
UVA 12092 Paint the Roads
分析:每个点存在于k个环中,转化为每个点的出度,入度都等于k。然后拆成两列点,S->i,容量为k花费为0;i->j+n,容量为1花费为边的长度;i+n->T,容量为k花费为0。最小费用最大流。
#include #include #include #include #include #include #include #include #include #include
View Code
POJ 2175 Evacuation Plan
题意:n个建筑物,每个建筑物里有ai个人,m个避难所,每个避难所可以容纳bi个人,现在给出一个分配方案(g[i][j]表示第i个建筑物去第j个避难所的人数),问是否总的距离是否是最小的,如果不是,输出任意一组比当前优秀的解。
分析:消圈定理:所谓消圈定理,就是在某个流f中,如果其对应的残余网络没有负圈(剩余流量为0的边视为不存在),那它一定就是当前流量下的最小费用流。反之亦然。即「f是最小费用流等价于其残余网络中没有负圈」。by sengxian。那么在这道题中,建出残余网络,找一下负圈,如果存在,那么是说明存在更优的方案,然后在圈上增广一下,得到更优的方案。否则,不存在更优的方案。
#include #include #include #include #include #include #include #include #include #include
View Code
备注:缺一道JOJ 2453,没找到提交地址?题目挺好的。