poj 3692 Kindergarten(二分匹配,最大独立集)

来源:互联网 发布:kaggle 知乎 编辑:程序博客网 时间:2024/05/17 06:44

                                                                                                      题目链接

Kindergarten
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 6485 Accepted: 3196

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
GB (1 ≤ GB ≤ 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 31 11 22 32 3 51 11 22 12 22 30 0 0

Sample Output

Case 1: 3Case 2: 4

Source

2008 Asia Hefei Regional Contest Online by USTC

[Submit]   [Go Back]   [Status]   [Discuss]




题解:

这是一道最大独立集的问题,就是构造一个互不认识的关系图,而且这是个二分图,二分图的最大独立集为总点数-二分匹配数,然后就转化成了最大匹配。


#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn=200+10;int g[maxn][maxn],match[maxn];bool used[maxn];int n,m;bool bfs(int u){for(int i=1;i<=m;i++){if(g[u][i]&&!used[i]){used[i]=true;if(match[i]<0||bfs(match[i])){match[i]=u;return true;}}}return false;}int hungry(){int ans=0;memset(match,-1,sizeof(match));for(int i=1;i<=n;i++){memset(used,false,sizeof(used));if(bfs(i)) ans++;}return ans;}int main(){int k;int cas=0;while(~scanf("%d%d%d",&n,&m,&k)){if(n==0&&m==0&&k==0) break;memset(g,0,sizeof(g));for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) g[i][j]=1;while(k--){int u,v;scanf("%d%d",&u,&v);g[u][v]=0;}printf("Case %d: %d\n",++cas,n+m-hungry());}}

























0 0
原创粉丝点击