网络流拓展三
总结有关拆点拆边
拆点:
1.结点有最大容量 拆点构造流量
2.结点只能经过一次 拆点加流量1
3.结点存在多种状态 例如构造每一天的状态
4.迷宫k覆盖问题
拆边:
某条边存在第一次经过和以后经过的状态不一样
例如第一天的权值和后面的权值不同 或者迷宫的点权只能取一次
2017新疆网赛J(拆点)
HDU 6118(流量不固定s-t最小流)
uva 10779
题目要求
蓝书P370
参考AC代码
|
|
思路
建图见蓝书P370-371
注意编号2-n的人拥有卡片数量为1的时候不执行任何操作
poj 3436
题目要求
有N台组装电脑的机器 每台电脑的组成有P部分。
每台机器有P个输入输出规格 还有一个最大容量Q(以每小时为单位)
其中输入规格有三种情况:0,1,2
0:该部分不能存在
1:该部分必须存在
2:该部分可有可无
输出规格有2种情况:0,1
0:该部分不存在
1:该部分存在
只有满足输入规则 该电脑才能进入机器加工 加工后的输出部分按照输出规则给出
求生产电脑最大的台数 以及加工的总次数
对于每次加工 输出由机器a到机器b 每小时输出了多少台电脑
参考AC代码
|
|
思路
建图:
首先对于每台机器都有一个容量 所以拆点 i到i+n 容量为w[i]
由S到i建边:由于刚开始的S为空 所以输入格式不能有1 若有不能建边 其余均由S连向i 容量为inf
有i+n到T建边:若输出的格式中均为1 那么建边 否则不能建边
若有某台机器的输出满足另一台机器的输出 那么两台机器建边 容量为inf
跑一遍dinic就可以求出最大流
这里对num和路径的输出判断是根据反向边来判断 由于反向边存储时flow=0 所以flow<0代表这条路径有流量经过
输出注意由于边是反向 颠倒位置输出即可
poj 1087
题目要求
题目大意:
在这个题目里有两种物品,一个是插座,一个是电器
插座只有一个插孔和一个插头,电器只有一个插头
首先有n种插座,n种插座用字符串表示,这n种插座可以理解为是插在电源上的插座
然后有m个电器,现在电器要充电,电器用字符串表示,每个电器都有自己可以插的插座
(这个插座可以不是那n个插在电源上的插座,可以是其他的插座)
现在有k个信息
s1 s2代表s1插座可以插到s2插座上去,这里类似于将插头转换了一下
这些s1与s2也可以不是那n个插在电源上的插座
给出这些个信息问你还有多少个电器没有插座可以用
参考AC代码
|
|
思路
建一个源点,指向所有电器,容量为1
所有电器指向他们可以插的那个插头上,容量为1
如果一个插头可以插到另一个插头,那么将s1指向s2,容量为无限大
将所有插在电源上的插头指向汇点,容量为1
注意点:
1.电器连向的插座可能超过n的范围 需要重新给该点计数
2.新加的插座不能连向T 他们只启到转换的作用
3.没有考虑k中的插座可能是新加的 但也过了 所以k中新加的插座在m种电器中必定出现过
4.注意数组大小至少开301
poj 3281
题目要求
有N头牛,F个食物,D个饮料。
N头牛每头牛有一定的喜好,只喜欢几个食物和饮料。
每个食物和饮料只能给一头牛。一头牛只能得到一个食物和饮料。
而且一头牛必须同时获得一个食物和一个饮料才能满足。问至多有多少头牛可以获得满足。
参考AC代码
|
|
思路
最大流建图是把食物和饮料放在两端。一头牛拆分成两个点,两点之间的容量为1.喜欢的食物和饮料跟牛建条边,容量为1.
加个源点和汇点。源点与食物、饮料和汇点的边容量都是1,表示每种食物和饮料只有一个。
注意:本题的牛由于只能经过一次(一个食物或者饮料只能给一头牛 一头牛只能获得一个食物或者饮料) 所以需要拆点 容量为1
poj 2516
题目要求
有n个商店,k种物品和m个供货商,让你求进满足商店需求的货物的最小花费?
输入n,k,m
然后是一个n×k的矩阵,n个商店对每种货物的需求,表示第i个商店需要第j种货物x个
然后是m×k的矩阵,m个供货商可以供k种货物的数量,表示第i个供货商 提供第j中货物x个
接下来是k个n×m的矩阵,表示第i个货物,由k供应商发货给j商店的价格x
参考AC代码
|
|
思路
最小费用最大流
常规解法需要拆点 把每个商品拆成n个点 代表每个供应商提供该物品给每个商店的价格 据说会超时
优化解法:每个满足条件的物品都跑一次mcmf
need为物品i的需求 sup为物品i的供给
对于第k个物品 若需求大于供给 flag置0输出-1
否则建图 s到每个商店 容量为这个商店需要第i个物品的数量 费用为0
每个供应商到t 容量为这个供应商提供第i个物品的数量 费用为0
商店到供应商利用第k个矩阵建图(在for循环里输入 可以避免开三维数组) 容量为inf 费用为第该供应商提供该物品到该商店的价格x
若所有商品都满足条件 ans加上所有的mcmf就是所求
poj 1459
题目要求
简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有np个是能提供电力的点,nc个是能消费电力的点,
剩下的点(n-np-nc)是中转战即不提供电力也不消费电力,点与点之间是有线路存在的,有m条线路,每条线路有最多运载限定。
前4个数据就是有n个点,np个供电点,nc个消费点,m条线路,接来题目先给出的是m条线路的数据,(起点,终点)最多运载量,
然后是np个供电点的数据(供电点)最多供电量,接着就是nc个消费点的数据(消费点)最多消费电量。
题目要我们求出给定的图最大能消费的总电量(就是求最大流)
参考AC代码
|
|
思路
多源多汇水题
建超级源点和超级汇点 np供电和S连 nc耗电和T连 m条路径相连 跑最大流
注意:
1.点的下标从0开始
2.题目输入有坑 每个括号前可以有任意多个空格 对cin没影响但是对scanf有影响
3.op是多余的条件
HDU 4292
题目要求
等价poj3281
参考AC代码
|
|
思路
见poj3281思路
区别在于本题每种食物和饮料都有一定的数量 cap为x即可
HDU 4289
题目要求
给一张无向图 n点m边 有源点S和汇点T 删除每个点需要一个点权 问破坏S到T的连通性的最小的花费是多少
参考AC代码
|
|
思路
等价于最小割 所以跑最大流 注意建图
拆点 i到i+n是该点的点权 u到v的双向边建成u+n到v和v+n到u 容量为inf 因为都是从右边的点寻找下一个城市
跑一遍最大流就是所求