POJ 3692:Kindergarten(二分图最大团)
2024-09-01 01:45:16
题意
已知班级有g个女孩和b个男孩,所有女生之间都相互认识,所有男生之间也相互认识,给出m对关系表示哪个女孩与哪个男孩认识。现在要选择一些学生来组成一个集合,使得里面所有人都认识,求此集合最大人数。
思路
二分图的最大团的定义:对于一般图来说,团是一个顶点集合,且由该顶点集合诱导的子图是一个完全图,简单说,就是选出一些顶点,这些顶点两两之间都有边。最大团就是使得选出的这个顶点集合最大。对于二分图来说,我们默认为左边的所有点之间都有边,右边的所有顶点之间都有边。那么,实际上,我们是要在左边找到一个顶点子集X,在右边找到一个顶点子集Y,使得X中每个顶点和Y中每个顶点之间都有边。
原图的最大团 = 补图的最大独立集
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 211;
int mp[N][N], match[N], vis[N], n, m;
bool dfs(int u) {
for(int v = 1; v <= m; v++) {
if(vis[v] || !mp[u][v]) continue;
vis[v] = 1;
if(match[v] == -1 || dfs(match[v])) {
match[v] = u;
return true;
}
} return false;
}
int Hungry() {
memset(match, -1, sizeof(match));
int ans = 0;
for(int i = 1; i <= n; i++) {
memset(vis, 0, sizeof(vis));
ans += dfs(i);
} return n + m - ans;
}
int main() {
int e, cas = 1;
while(~scanf("%d%d%d", &n, &m, &e), n + m + e) {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) mp[i][j] = 1;
for(int i = 1; i <= e; i++) {
int u, v; scanf("%d%d", &u, &v);
mp[u][v] = 0;
}
printf("Case %d: %d\n", cas++, Hungry());
}
return 0;
}
最新文章
- RapidJSON 代码剖析(三):Unicode 的编码与解码
- HIbernate的对象状态
- 51nod 1163贪心
- How To Use API Online?
- VirtualDesktop与Desktops多窗口程序的对比
- [C#][转][string 字符串截取
- ios模拟器安装.app
- java集合框架02——Collection架构与源码分析
- html的常用基础应用
- Spring配置中<;context:annotation-config>; VS <;context:component-scan>;
- JS中replace()用法举例
- HTML5入门要点
- keepalived vip 没有生成或者生成了ping不通?
- SQL Server (MSSQLSERVER) 服务因 2148081668 服务性错误而停止。
- centos6.5 yum安装lamp
- Storm 第三章 Storm编程案例及Stream Grouping详解
- HDU 3172 Virtual Friends(map+并查集)
- compass框架的sprite雪碧图的用法简要
- jQuery插件实现表格隔行换色且感应鼠标高亮行变色
- 使用python进行图像处理-调整图片大小
热门文章
- Parse陨落,开发者服务今后路在何方?
- WPF中的文字修饰——上划线,中划线,基线与下划线
- C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享
- DSP Builder 12.0安装及crack方法
- Win8 Metro(C#)数字图像处理--2.71Sigma平滑滤波器
- 读取注册表获取Windows系统XP/7/8/10类型(使用wcscmp比较wchar[]内容)
- linux+php+swoole解决方案
- C++的 RTTI 观念和用途(非常详细)
- CEGUI 0.7.7 VS2010+SP3 编译过程
- Design Thinking Workshop @ Agile Tour 2013 Shanghai