图论——二分图匹配
二分图
lllllan.
盛意以江河,江河不及你
展开
-
二分图匹配
博客分享大佬的博客,有趣易懂:算法讲解:二分图匹配二分图匹配——匈牙利算法基本概念无向图 边没有方向的图。二分图 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。匹配 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。 极大匹配(Maximal Matching)原创 2020-08-04 00:32:11 · 129 阅读 · 0 评论 -
HDU1526 A Plug for UNIX——二分匹配+传递闭包
点这里题意: 房间里有a个插座和b个电器设备,以及c个适配器,相同接口的设备可以直接连接插座,不同接口的也可以使用适配器来连接。问最少有多少个设备没有插座可以用。题解: 都这么问了,显然就是二分图最大匹配的问题了,可以选择用最大流的模板去做,也可以用比较简洁的匈牙利算法。问题在于适配器的问题怎么处理——Floyd传递闭包。下面代码为二分匹配的匈牙利算法。过程中犯的错:cnt的初始化: 必须从1开始。#include<iostream>#include<al...原创 2020-09-10 14:53:50 · 88 阅读 · 0 评论 -
HDU3605 Escape——二分图多重匹配
点这里题意: n个人和m个星球。一个星球上可以住若干个人,给出每个人想要选择的星球,然后给出每个星球最多容纳的人数。问是否能将所有人转移。题解: 网上有看到网络流+状态压缩的做法,但是这题直接当二分图匹配来做还是比较简单的。无非星球有一定的容量,允许多次匹配。#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int n, m;int G[N][12];int size[12];i...原创 2020-09-09 17:47:25 · 125 阅读 · 0 评论 -
HDU3861 The King’s Problem——强连通分量(tarjan+最小路径覆盖)
点这里题意: 给定一个无向图,要求:①两点强连通的必须划分在同一个分块;②同一个分块中任意两点至少有一条边。求最少能划分几个分块。题解: 如果问的是最多有几个分块,那我们只要考虑条件一,直接求无向图中有多少个强连通分量就可以了。但是为了求得最少分块,需要满足条件二,那这部分就是最小路径覆盖的问题了。过程中犯的错:**if(DFS(i)) sum++;**一开始写成了if(DFS[i]) sum++;,程序能正常运行,然后就找了半天的问题。#include<bits/st...原创 2020-09-02 09:04:38 · 126 阅读 · 0 评论 -
HDU3729 I‘m Telling the Truth——最大匹配+最大字典序
点这里题意: 每个人对应一个分数区间,而每一个分数只能有一个人,求能将一个人对应一个分数的最大人数。输出最大匹配,还要输出这些匹配的人的序号,按最大字典序。题解: 除了输出每个人的序号,都是最大匹配的裸题,套个模板就能做。至于按照最大字典序输出,其实只要再匹配的过程中,是从n->1进行匹配的就可以了。做题过程犯的错:用了页面的翻译,导致题面显示出错,数据大小100000多了一个人,导致我写的时候开了1e6的大小,提交之后TLE了。#include<bits/stdc++.h&原创 2020-08-20 14:01:25 · 142 阅读 · 0 评论 -
HDU1083 Courses——最大匹配裸题
点这里题意: n个学生和p个课程,要求每个课程都有一个对应的课代表,并且一个学生只能担任一个课代表。如果这个最大匹配等于学生人数,则输出YES,否则输出NO。题解: 就是一个最大匹配的裸题,题目看懂就能直接套模板,不会写的应该是模板不会用,建议先去学好匈牙利算法。过程中犯的错:题意没有弄清楚,求最大匹配是毋庸置疑的,但我想当然地以为是最大匹配等于课程数量就可以了,(毕竟下意识认为多少课程就需要多少课代表咯),但是这个题目的要求是最大匹配等于学生人数才输出YES。模板不熟悉,我尝试着想背出模板原创 2020-08-19 12:08:43 · 120 阅读 · 0 评论 -
CodeForces - 687A.NP-Hard Problem——二分图染色
传送门题意: 判断给出的条件能否构成二分图,不能则输出-1,可以的话还要输出染色以后的两个集合(输出其中一种正确的答案即可)。题解: 用dfs给点染色。#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn = 1e5 + 10;int n, m, x, y, cnt, ans;int head[maxn], color[maxn]原创 2020-08-05 02:57:12 · 139 阅读 · 0 评论 -
HDU 2444 The Accomodation of Students——二分图判定、最大匹配
传送门题意: 判断能否将所有彼此了解的人分开,分成两组。如果可以还要输出最大匹配。题解:原创 2020-08-05 02:41:39 · 94 阅读 · 0 评论 -
POJ 3041 Asteroids——最小点覆盖,最大匹配
传送门题意: 有一个n*n的网格,上面有m个小行星,一个武器一次可以摧毁一行或一列的全部小行星,问武器至少多少次能把所有小行星摧毁。题解: 这个问题可以转化为最小点覆盖问题,把每行当做一个点放入左边的集合,每列当做一个点放入右边的集合,最小点覆盖是指用最少的点让每条边都至少和其中一个点关联,也就是最少的点可以关联所有连线。最小点覆盖数 = 最大匹配数。#include<iostream>#include<algorithm>#include<cstring>#原创 2020-08-04 02:19:58 · 101 阅读 · 0 评论 -
HDU 1068 Girls and Boys——最大独立集
传送门题意: 按一男一女配对,求不能配对的最大独立集,等于顶点数-最大匹配。#include<iostream>#include<algorithm>#include<cstring>#include<vector>using namespace std;int n, x;vector<int> G[1600];int match[1600], vis[1600];bool dfs(int x){ for (int i原创 2020-08-04 02:13:40 · 112 阅读 · 0 评论 -
HDU 1045 Fire Net——二分图最大匹配/DFS
传送门题意: 在一个n*n的图中,X表示墙,.表示空地,要求在空地上放置堡垒,且两个堡垒不能放在同一行或同一列上,除非中间隔着一堵墙。求能放置堡垒的最大数量。题解: 首先图很小,最大情况为4*4,DFS深搜就能做出来,后面也有dfs的代码。同时这也是一道典型的二分图求最大匹配的题目吧,但是谁和谁匹配,已经脱离普通的横纵坐标的匹配了,需要给每个点重新编号。匈牙利算法左图排除横向上重复,如果中间没有墙,则每行为同一编号。右图同理为排除纵向上的重复。然后将此分为两个集合,至此,就已经转化为二分图的最大匹配原创 2020-08-04 02:06:08 · 198 阅读 · 0 评论