POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法
2015-10-01 11:59
411 查看
Kindergarten
Description
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 players
know each other. You are to help to find maximum number of kids the teacher can pick.
Input
The input consists of multiple test cases. Each test case starts with a line containing three integers
G, B (1 ≤ G, B ≤ 200) and M (0 ≤ M ≤ G × B), which is the number of girls, the number of boys and
the number of pairs of girl and boy who know each other, respectively.
Each of the following M lines contains two integers X and Y (1 ≤ X≤ G,1 ≤ Y ≤ B), which indicates that girl X and boy Y know each other.
The girls are numbered from 1 to G and the boys are numbered from 1 to B.
The last test case is followed by a line containing three zeros.
Output
For each test case, print a line containing the test case number( beginning with 1) followed by a integer which is the maximum number of kids the teacher can pick.
Sample Input
Sample Output
题意是幼儿园有很多小孩,男生和男生互相熟悉,女生和女生互相熟悉。然后给出了一些男生和一些女生互相熟悉的关系,要找到一个最大的群体,这个群体中所有人都互相熟悉,问这个群体最多多少人。
二分图的最大点独立集(二分图中两两互不相连的点的集合) = N - 二分图的最大匹配数量
这个题要求的点独立集是要两两互相连,所以这要求的是补图的最大点独立集。
代码:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 5884 | Accepted: 2877 |
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 players
know each other. You are to help to find maximum number of kids the teacher can pick.
Input
The input consists of multiple test cases. Each test case starts with a line containing three integers
G, B (1 ≤ G, B ≤ 200) and M (0 ≤ M ≤ G × B), which is the number of girls, the number of boys and
the number of pairs of girl and boy who know each other, respectively.
Each of the following M lines contains two integers X and Y (1 ≤ X≤ G,1 ≤ Y ≤ B), which indicates that girl X and boy Y know each other.
The girls are numbered from 1 to G and the boys are numbered from 1 to B.
The last test case is followed by a line containing three zeros.
Output
For each test case, print a line containing the test case number( beginning with 1) followed by a integer which is the maximum number of kids the teacher can pick.
Sample Input
2 3 3 1 1 1 2 2 3 2 3 5 1 1 1 2 2 1 2 2 2 3 0 0 0
Sample Output
Case 1: 3 Case 2: 4
题意是幼儿园有很多小孩,男生和男生互相熟悉,女生和女生互相熟悉。然后给出了一些男生和一些女生互相熟悉的关系,要找到一个最大的群体,这个群体中所有人都互相熟悉,问这个群体最多多少人。
二分图的最大点独立集(二分图中两两互不相连的点的集合) = N - 二分图的最大匹配数量
这个题要求的点独立集是要两两互相连,所以这要求的是补图的最大点独立集。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #pragma warning(disable:4996) using namespace std; int grid[205][205]; int link[205]; int visit[205]; int n,m,k,V1,V2; int result; bool dfs(int x) { int i; for(i=1;i<=V2;i++) { if(grid[x][i]==0&&visit[i]==0) { visit[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=x; return true; } } } return false; } void Magyarors() { int i; result=0; memset(link,-1,sizeof(link));//!!这里不能是0 for(i=1;i<=V1;i++) { memset(visit,0,sizeof(visit)); if(dfs(i)) result++; } cout<<V1+V2-result<<endl; } int main() { int i,j,pair,temp1,temp2; for(i=1;;i++) { scanf("%d%d%d",&n,&m,&pair); V1=n; V2=m; if(n==0&&m==0&&pair==0) break; cout<<"Case "<<i<<": "; memset(grid,0,sizeof(grid)); for(j=1;j<=pair;j++) { scanf("%d%d",&temp1,&temp2); grid[temp1][temp2]=1; } Magyarors(); } return 0; }
相关文章推荐
- 初探Java类加载机制
- KMP算法初探
- java篇 【7】方法(函数)的声明及使用
- 使用批处理bat作为日期系统日期的前三天
- 设计模式-----观察者模式(Obsever)
- _范例讲解:一对多关系
- Unity 获得Log
- 自定义UIActionSheet
- JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作(《剑指offer》)
- Mysql安装各种问题
- swift开发笔记9 - 正向和反向页面传参
- 贝叶斯算法
- 实战体会Java的多线程编程
- Android 事件处理详解(二) —— 基于回调的事件处理
- Float 水平居中浮动
- android模拟器
- 运用CSS实现float:center 居中浮动li
- JavaScript类型检测
- 冒泡排序
- java中调用dll文件的两种方法