hdu 2458 Kindergarten 匹配
来源:互联网 发布:淘宝订单申请售后时间 编辑:程序博客网 时间:2024/05/17 00:09
题目大意:幼儿园中所有的男孩之间都互相认识,所有的女孩都互相认识,男孩和女孩之间有一部分互相认识,求一个最大完全子图(最大团),即去一些顶点,使得他们之间都互相认识,并使取出的节点数最多。
男孩和女孩本身就是完全子图,将女孩看成一个集合,男孩看成一个集合,不能直接选择认识关系作为边集(因为这样不符合二分图定义),所以选认识关系的补集作为边集,即在不认识的人之间连边,则最大完全子图即即对应最大点独立集。即求最大点独立集。
最大点独立集个数=顶点数-点覆盖数,点覆盖数=匹配数。
#include <stdio.h>#include <string.h>#define maxn 500int nx,ny;int g[maxn][maxn],ans,sx[maxn],sy[maxn];int cx[maxn],cy[maxn];int path(int u){ sx[u]=1; int v; for(v=1;v<=ny;v++) { if(g[u][v]>0&&!sy[v]) { sy[v]=1; if(!cy[v]||path(cy[v])) { cx[u]=v;cy[v]=u; return 1; } } } return 0;}int solve(){ ans=0; int i; memset(cx,0,sizeof(cx)); memset(cy,0,sizeof(cy)); for(i=1;i<=nx;i++) { if(!cx[i]) { memset(sx,0,sizeof(sx)); memset(sy,0,sizeof(sy)); ans+=path(i); } } return 0;}int main(){ int tot=1; int m,i; int x,y; while(1) { memset(g,1,sizeof(g)); scanf("%d%d%d",&nx,&ny,&m); if(nx==0&&ny==0&&m==0) break; for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); g[x][y]=0; } solve(); printf("Case %d: %d\n",tot,nx+ny-ans); tot++; } return 0;}
- hdu 2458 Kindergarten 匹配
- 【HDU】2458 Kindergarten 二分匹配
- hdu 2458 二分图匹配 Kindergarten
- HDU 2458 Kindergarten
- 最大匹配-HDOJ 2458 Kindergarten
- hdu 2458 Kindergarten (最大独立集)
- HDU 2458 Kindergarten【二分图之反建边】
- HDU 2458 — Kindergarten 最大团
- HDU 2458 Kindergarten (最大独立集)
- 【二分匹配】 hdu2458 Kindergarten
- 杭电2458 Kindergarten(二分图最大匹配)
- poj 3692 Kindergarten 二分匹配
- HDU 2458Kindergarten(二分图 最大团点数)
- POJ - 3692 Kindergarten 二分图 最大匹配
- poj 3692Kindergarten(二分匹配模板)
- 【图论】【二分图匹配】[POJ 3692]Kindergarten
- Kindergarten
- HDU-2458 Kindergarten 最大完全子图(最大团)中顶点的个数
- excel中如何设置下拉框,并且不同值显示不同颜色
- JAVA编程思想第四版-多线程的练习答案之练习18
- 数据结构之链表
- C++ 前景
- JAVA编程思想第四版-多线程的练习答案之练习19
- hdu 2458 Kindergarten 匹配
- NSLocale的一些方法
- Emacs for Linux安装指南
- 工作环境迁移:Ubuntu 12.04 使用笔记(四)
- 【机器学习1】线性回归,贝叶斯
- MVC学习笔记五:HTML辅助方法【上】
- JAVA编程思想第四版-多线程的练习答案之练习20
- Bert Ertman专访:将Spring及遗留应用迁移到Java EE 6平台
- android onTouchEvent和setOnTouchListener中onTouch的区别