图论——二分图
#
夕林山寸
这个作者很懒,什么都没留下…
展开
-
网络流二十四题 ————(十二)、P4014 分配问题 二分图带权匹配 网络流解法
做了10多道网络流,没看题解和思路,自己就建立出了二分图带权匹配的费用流模型。感觉已经算是入门了!!如下建边:左部图n个点表示工人,右部图n个点表示工作S连向左部图每个点,流量为1,费用为0.右部图每个点连向T,流量为1,费用为0。这里连向S,T的边流量为1的目的是为了让每个工人做一个工作,每个工作只能一个工人做!然后工人i连向工作j,流量为1,费用为a[i][j],这样跑最小费用最大流,求出的是最小的工作效率,即二分图最小带权匹配。显然费用直接设为负数,就是二分图的最大带权匹配原创 2020-10-10 19:27:51 · 236 阅读 · 0 评论 -
网络流二十四题 ————( 三) 、P2764 最小路径覆盖问题 转化为二分图最大匹配用 网络流求解
设一个有向无环图G =(V,E),n=|V|。把G中的每个点x拆成编号为x和x+n的两个点。建立一张新的二分图,1-n做为二分图的左部点,n+1 -> 2n 做为二分图的右部点,对于原图的每条有向边(x,y),在二分图中的左部点x与右部点y+n之间连边。最终得到的二分图称为G的拆点二分图,记为G2。定理:有向无环图G的最小路径点覆盖包含的路径条数,等于n减去拆点二分图G2的最大匹配数。证明:详细证明在算法竞赛——进阶指南这本书上。我简单说下:最大匹配的每条边对应G中的.原创 2020-10-07 22:25:37 · 178 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing378. 骑士放置 最大独立集
不能相互攻击。我们把每个点相互攻击的格子连边,就相当于求最大独立点集。且走日字,起末的(横纵坐标和)一定奇偶性不同。满足二分图的性质等于n-最大匹配。建模完毕。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(原创 2020-05-09 21:44:46 · 222 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing377. 泥泞的区域 2要素,转化二分图求最小点覆盖
2要素即:每条边有2个端点,两者至少选择一个。求最小选择的端点数。对于这一题:我们发现:每个泥泞格子要么被列木板覆盖,要么被横向模板覆盖,且至少选择一种类型的木板。显然这符合2要素,直接转化为二分图模型来做:我们对每一个泥泞的格子视为一条边,连接某一列木板,和某一行木板。注意,第i行可能有多个木板,我们要赋予他们不同的id。比如:.**...**. 这一行前面的2个泥泞格子与后面的泥泞格子所需要的行木板是不相同的。预处理出id,直接二分图最大匹配即可。#in..原创 2020-05-09 19:24:28 · 201 阅读 · 0 评论 -
ICPC Pacific Northwest Regional Contest 2019 I. Error Correction 0/1要素 转化二分图 最大独立集
这题求一个子集,使得任意2个字符串不能通过一次swap相互得到。即让任意2个字符串可以通过一次swap得到的字符串连边,即求最小点覆盖。显然任意图N=500无法求(NP问题)很容易发现:这是个01要素二分图性质。即设立一个初始串,一个字符串需要X次变化得到初始串,另一个串通过Y次变化得到初始串。显然:如果(X&1) == (Y&1),则这两个字符串不可能连边...原创 2020-05-08 12:06:29 · 226 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing376. 机器任务 0/1要素,问题转化为二分图模型 二分图最小点覆盖
关于二分图最小点覆盖的模型:1:每条边2个端点2:每条边至少选择一个端点。这一题:这里注意0连的边不能加。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e3+7;int head[M],cnt;void init(){cnt=0,memset(...原创 2020-05-07 23:04:26 · 171 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing374. 导弹防御塔 巧妙转二分图多重匹配
二分时间。固定时间后,每个防御塔发射炮弹数量是固定的。每枚炮弹可打的敌人也是固定的。相当于一个多重匹配,左部图一个可匹配多个,有部图一个只能匹配一个。把左部图拆成多个点,进行最大匹配。#include <bits/stdc++.h>using namespace std;typedef long double ld;typedef long long ...原创 2020-05-07 18:52:12 · 184 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing373. 車的放置 二分图模型 匈牙利算法
根据上一篇博客里的二分图模型:01要素。这一题我们可以这样构建:把每行当成一个点,每列当成一个点,行列分成2个集合。1.行之间,列之间不会连边。2.每行只会与一个列相连,表示 i行j列这个位置放一个车。由于车会打一行一列,所以这行这列都不能再放车了。上述满足二分图模型。求最大匹配则可以直接套匈牙利算法即可。#include <bits/stdc++.h>u...原创 2020-05-06 10:50:23 · 175 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing372. 棋盘覆盖 匈牙利算法的模型 0要素/1要素
这类问题可以转化为二分图求最大匹配:1.节点能分成2个独立的集合,每个集合内部有0条边2.每个节点只能与1条匹配边相连。这一题显然满足以上2个要素。1:把棋盘分成黑白相间的两个集合,相邻的一黑一白连边表示放一个骨牌,显然同黑同白不会连边2:由于骨牌不会重叠,所以每个点只会有一个匹配边。然后求最大匹配。直接匈牙利算法即可解决。注意一些小细节:最多2e4条边。因为每个点...原创 2020-05-06 10:41:18 · 168 阅读 · 0 评论 -
P3386 【模板】二分图最大匹配 匈牙利算法模板
算法步骤:1.把所有点设为非匹配点,S=空集,所有边都是非匹配边。2.寻找增广路,把路径上所有边状态取反,得到更大匹配Si。3,重复2步,直到不存在增广路。增广路即:从非匹配点开始,到非匹配点结束,中间经过的边满足:非匹配边和匹配边交替。找增广路过程:枚举左部点x,枚举其连接的右部点y,若y为匹配,由于x为匹配,则构成了长度为1的增广路。若y匹配,则枚举y连接的所有左部...原创 2020-05-05 21:12:37 · 208 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing257. 关押罪犯 二分图解法
之前写过带权并查集解法。这次是二分图:#include <bits/stdc++.h>using namespace std;typedef long long ll;#define pb push_backconst int M = 1e5+7;const int N =2e4+7;vector<int>G[N];int n,m;struct ...原创 2020-05-05 20:03:42 · 217 阅读 · 0 评论