[HDU2458]Kindergarten(二分图匹配,最大团)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2458

题意:n男m女构成二分图,希望找出k个人,使他们互相都认识。

相当于求这个图的最大团,由于特殊性质(是个二分图),因此可以可以用一个定理:

最大团 = 补图的最大独立集

其实想一下这个定理也很合理。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 210;
 5 int nu, nv;
 6 int G[maxn][maxn];
 7 int linker[maxn];
 8 bool vis[maxn];
 9
10 bool dfs(int u) {
11     for(int v = 1; v <= nv; v++) {
12         if(G[u][v] && !vis[v]) {
13             vis[v] = 1;
14             if(linker[v] == -1 || dfs(linker[v])) {
15                 linker[v] = u;
16                 return 1;
17             }
18         }
19     }
20     return 0;
21 }
22
23 int hungary() {
24     int ret = 0;
25     memset(linker, -1, sizeof(linker));
26     for(int u = 1; u <= nu; u++) {
27         memset(vis, 0, sizeof(vis));
28         if(dfs(u)) ret++;
29     }
30     return ret;
31 }
32
33 int k;
34
35 int main() {
36     // freopen("in", "r", stdin);
37     int u, v;
38     int _ = 1;
39     while(~scanf("%d%d%d",&nu,&nv,&k)&&nu+nv) {
40         for(int i = 1; i <= nu; i++) {
41             for(int j = 1; j <= nv; j++) {
42                 G[i][j] = G[j][i] = 1;
43             }
44         }
45         for(int i = 0; i < k; i++) {
46             scanf("%d%d",&u,&v);
47             G[u][v] = 0;
48         }
49         printf("Case %d: %d\n", _++, nu+nv-hungary());
50     }
51     return 0;
52 }
时间: 2024-11-03 21:50:31

[HDU2458]Kindergarten(二分图匹配,最大团)的相关文章

poj 3692 Kindergarten(二分图匹配)

题意:n个男孩相互认识,m个女孩相互认识,k对男孩和女孩相互认识,求最大的任意两人相互认识的集合: 思路:二分图匹配: 独立集=总数-最大匹配数: 最大团=原图补图的最大独立集=总数-补图的最大匹配数: 本题就是求最大团,先求补图的最大匹配数,匈牙利算法: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,m; int mm[505][505]; int

Poj_3692 Kindergarten -二分图的最大团

题目:在二分图中找出最大的完全二分图 定理:二分图的最大团=其补图的最大独立集 /************************************************ Author :DarkTong Created Time :2016/7/31 15:17:40 File Name :Poj_3296.cpp *************************************************/ #include <cstdio> #include <cst

二分图的最大团

In a kindergarten, there are a lot of kids. All girls of the kids know each other and all boys also know each other. In addition to that, some girls and boys know each other. Now the teachers want to pick some kids to play a game, which need that all

【图论】二分图匹配总结

二分图匹配总结 二分图匹配 1.二分图最大匹配.求两个集合内,每一个元素仅仅能用一次.两集合间存在一些匹配关系,求最大匹配多少对,利用匈牙利算法,对于每一个结点不断去找增广路去匹配 有几个重要性质: 1.最小点覆盖 = 最大匹配 2.最大独立集 = 总结点 - 最大匹配 模板: bool dfs(int u) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (vis[v]) continue; vis[v] = 1; i

二分图匹配总结与习题

模板: (用时间戳记录可以避免每一次memset vis) #include<bits/stdc++.h> using namespace std; #define N 2005 #define M 1000005 int match[N],vis[N],T=0;//只存一边的匹配点 int to[M],head[N],tot=0,nex[M]; void add(int a,int b) { to[++tot]=b; nex[tot]=head[a]; head[a]=tot; } bool

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int inf=0x3f3f3f3f; 6 const int sink=30; 7 8 struct Edge 9 { 10 int to; 11 int next; 12 int capacity; 13 14 void assign(int t,int n,int c) 15 { 16 to=t; next=n; ca

棋盘游戏(二分图匹配)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3200    Accepted Submission(s): 1897 Problem Description 小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放

BZOJ 1854 游戏(二分图匹配或并查集)

此题的二分图匹配做法很容易想,就是把属性当做s集,武器当做t集,如果该武器拥有该武器则连一条边. 那么答案就是求该二分图的最大前i个匹配.将匈牙利算法改一改,当前找不到增广路就break. 但是过这个题需要常数优化,不能每次都fillchar一遍used数组.可以用队列将使用的used点加入,然后需要初始化的时候弹出即可. # include <cstdio> # include <cstring> # include <cstdlib> # include <i

HDU 3081:Marriage Match II(二分图匹配+并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意:有n个男生n个女生,他们只有没有争吵或者女生a与男生A没有争吵,且女生b与女生a是朋友,因此女生b也可以和男生A过家家(具有传递性).给出m个关系,代表女生a和男生b没有争吵过.给出k个关系,代表女生a与女生b是好朋友.每一轮过家家之后,女生只能选择可以选择并且没选过的男生过家家,问游戏能进行几轮. 思路:因为n<=100,因此支持O(n^3)的算法,挺容易想到是一个二分图匹配的.(出现在我的网络

11082 - Matrix Decompressing (网络流建模|二分图匹配)

该题是一道经典的二分图匹配的题目 .现在终于有点明白什么是二分图匹配了,其实说白了就是依赖于最大流算法之上的一种解决特定问题的算法 . 所谓二分图,就是我们假定有两个集合A和B,每个集合中有若干元素(点),其中源点与A相连,汇点与B相连,并且他们的总容量决定了最终答案的上限,所以一定要维护好 . 然后由A中的点向B中的点连线,他们之间也有一定的容量制约关系(具体看题目中的边权值限制).这样就可以求出最大流量匹配了. 有时我们要求完美匹配,即所有流入的量等于流出的量  . 该题构思极其巧妙,因为我