随笔分类 - 二分匹配
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=2444题意:给出一些两两认识的学生,把这些学生分成两组,每组中的学生都不互相认识,如果可以完成,那么把他们安排进一些双人间中,每个房间中只能住相互认识的学生,如果不可以分成两组 输出 No,可以住的那么输出最多需要多少个房间思路:求是否可以分成两组用dfs黑白染色,看给出的关系是否是一个二分图。判断房间数用则用二分匹配对无向图进行匹配,求出最大匹配数,即为房间数。感觉更像模板题,直接套用最大匹配模板就可以了View Code 1 #include <stdio.h> 2 #include &
阅读全文
摘要:http://poj.org/problem?id=3020题目就是一个最小路径覆盖的问题,因为这是一个无向图,所以,最小路径覆盖数 = "*"的总数 - 最大匹配数/2; 如果是一个有向图,则最小路径覆盖数 = "*" 的总数 - 最大匹配数。最大匹配用匈牙利算法就可以了,然后就是建图,因为题目中说了,可以上下左右的覆盖(只要是连着的),所以建图的时候,如果遇到一个 "*" 还要判断一下它的四周是不是也是 "*"; 1 #include<stdio.h> 2 #include<string.h&
阅读全文
摘要:http://poj.org/problem?id=1274这道题目与1469是一样的,我感觉连输出形式都差不多。只不过这里是牛与什么的匹配,同样,把他们分别用两个集合来保存,然后用匈牙利算法来求得最大匹配数 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 210 6 int map[N][N],m[N],v[N]; 7 int n,mm; 8 int dfs(int x) 9 {10 int i;11 for(i
阅读全文
摘要:http://poj.org/problem?id=3041这个题目真的一点变形都没有,直接套一个匈牙利算法求最大匹配数。把所给的点,分成两个集合,然后用一个模板就可以了 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 510 6 int map[N][N],v[N],m[N]; 7 int n,g; 8 bool dfs(int x) 9 {10 int i;11 for(i=1;i<=n;i++)12 {
阅读全文
摘要:http://poj.org/problem?id=1469题目是说有几门课程和几个学生,让你求的学生和课程之间的最大匹配数是否和所给的课程数目相等。如果相等输出“YES” 否则,输出“NO“下面这就是一个二分图 二分图模型二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集。给定一个二分图
阅读全文

浙公网安备 33010602011771号