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

hdu2458

题意:给定G(G <= 200)个女孩和B(B <= 200)个男孩,以及M(0 <= M <= G*B)条记录(x, y)表示x号女孩和y号男孩互相认识。并且所有的女孩互相认识,所有的男孩互相认识,求找到最大的一个集合使得所有人都认识。

即求图的最大完全子图(最大团),那么可以转化为求补图的最大独立集(集合中的任意两点没有边相邻),而补图正好是一个二分图,二分图的最大独立集 = 顶点数 - 最大匹配

 1 //求最大独立集
 2 #include <stdio.h>
 3 #include <string.h>
 4 const int N = 222;
 5 int G,B,m;
 6 int Map[N][N];
 7 bool vis[N];
 8 int cx[N],cy[N];
 9
10 bool dfs(int u)
11 {
12     int i;
13     for(i=1; i<=B; ++i)
14     {
15         if(!vis[i] && Map[u][i])
16         {
17             vis[i] = true;
18             if(cy[i] == -1 || dfs(cy[i]))
19             {
20                 cy[i] = u;
21                 cx[u] = i;
22                 return true;
23             }
24         }
25     }
26     return false;
27 }
28 int MaxMatch()
29 {
30     memset(cx, -1, sizeof(cx));
31     memset(cy, -1, sizeof(cy));
32     int ans = 0;
33     for(int i=1; i<=G; ++i)
34     {
35         if(cx[i] == -1)
36         {
37             memset(vis, 0, sizeof(vis));
38             ans += dfs(i);
39         }
40     }
41     return ans;
42 }
43 int main()
44 {
45     int a,b,i;
46     int tCase = 1;
47     while(true)
48     {
49         scanf("%d%d%d",&G,&B,&m);
50         if(!G && !B && !m)
51             break;
52         memset(Map, 0, sizeof(Map));
53         for(i=1; i<=m; ++i)
54         {
55             scanf("%d%d",&a,&b);
56             Map[a][b] = 1;
57         }
58         for(i=1; i<=G; ++i)
59             for(int j=1; j<=B; ++j)
60                 Map[i][j] = !Map[i][j];
61         int ans = MaxMatch();
62         printf("Case %d: %d\n",tCase++,G + B - ans);
63     }
64 }
时间: 2024-10-12 02:52:38

最大团=补图的最大独立集的相关文章

二分图的最小顶点覆盖 最大独立集 最大团

二分图的最小顶点覆盖 定义:假如选了一个点就相当于覆盖了以它为端点的所有边.最小顶点覆盖就是选择最少的点来覆盖所有的边. 方法:最小顶点覆盖等于二分图的最大匹配. 我们用二分图来构造最小顶点覆盖. 对于上面这个二分图,顶点分为左右两个集合,X集合包含1,2,3,4,Y集合包含5,6,7,8,9.假如现在我们已经找到一个最大匹配M,就是上面的红线所标注的M={(1,7),(2,5),(4,8)}.我们作如下定义:(1)定义1.2.4.5.7.8为已经匹配过的点,其他点为未匹配的点:(2)定义(4,

poj1419 Graph Coloring 最大独立集(最大团)

最大独立集: 顶点集V中取 K个顶点,其两两间无连接. 最大团: 顶点集V中取 K个顶点,其两两间有边连接. 最大独立集=补图的最大团最大团=补图的最大独立集 #include<iostream> #include<cstring> #include<cstdio> using namespace std; int mp[110][110],mark1[505],mark2[505]; int n,m; int cnt,maxx; void dfs(int x) { i

最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

在讲述这两个算法之前,首先有几个概念需要明白: 二分图: 二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A, j in B), 则称图G是二分图. 匹配: 给定一个二分图,在G的一个子图G'中,如果G'的边集中的任意两条边都不依附于同一个顶点,则称G'的边集为G的一个匹配 最大匹配: 在所有的匹配中,边数最多的那个匹配就是二分图的最大匹

poj 1419 Graph Coloring_最大独立集

题目链接 题意:给出你一个无向图,然后对其中的点去上色, 只能上黑色和白色,要求是黑色点不能相邻,问最多能上多少黑色的顶点. 思路:点独立集:设无向图G=<V,E>,顶点集合V'是V的子集,若V'中的任意两个顶点都不相邻,则称V'为G的点独立集 这题求的是最大独立集 还有一个定理是最大独立集=补图的最大团 最大团=补图的最大独立集 #include<stdio.h> #include<string.h> #define MAXN 100 int n,map[MAXN][

[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

poj 3692 Kindergarten,二分图的最大团

最大独立集 = V - 最小顶点覆盖 二分图的最小顶点覆盖数 = 最大匹配数 最大团 = 补图的最大独立集 #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <vector> #include <queue> using namespace std; const int maxn = 200 + 10; int n,

二分图的最大团

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

Gym - 101915D Largest Group 最大团

给你一个二分图 问你最大团为多大 解一:状压DP 解二:二分图最大匹配 二分图的最大团=补图的最大独立集 二分图最大独立集=二分图定点个数-最大匹配 //Hungary #include<bits/stdc++.h> using namespace std; #define N 50 int useif[N]; //记录y中节点是否使用 0表示没有访问过,1为访问过 int link[N]; //记录当前与y节点相连的x的节点 int mat[N][N]; //记录连接x和y的边,如果i和j之

JSOI Round 2题解

强行一波题解骗一个访问量好了... http://blog.csdn.net/yanqval/article/details/51457302 http://absi2011.is-programmer.com/posts/200822.html http://absi2011.is-programmer.com/posts/200920.html orz js省队神犇↑ Day1 最佳团队(team) 给一个n+1个点的树,每个点有价值pi和费用si,求一个包含根的大小为m+1的联通块,使价值