题干意思就是 有g 个女孩,b 个男孩,s种匹配关系,代表两个人认识(男的互相之间全认识,女的也是)
现在求一下这个图里的最大团。
那么问题来了,我们想一下,男的全认识,女的之间也是全认识,一个图的最大团不就是补图的最大独立集吗,那么我们既然直接求最大团有点麻烦,不如看一下补图。二分图的最大团不会求,但是我们可以求二分图的最大独立集 = n - 最大匹配
所以构造补图,然后求最大独立集,成功得出答案。。。
以下是AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 500;
int vis[maxn];
int match[maxn];
int ed[maxn][maxn];
int g,b,m;
void init()
{
memset(match,0,sizeof(match));
memset(ed,0,sizeof(ed));
}
int dfs(int u)
{
for(int v=1;v<=b;v++)
{
if(!vis[v] && !ed[u][v])
{
vis[v] = 1;
if(!match[v] || dfs(match[v]))
{
match[v] = u;
return 1;
}
}
}
return 0;
}
int main()
{
int num = 1;
while(scanf("%d%d%d",&g,&b,&m)&&g&&b&&m))
{
int x,y;
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
{
ed[x][y] = 1;
}
}
int res = 1;
for(int i=1;i<=g;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
{
res ++;
}
}
printf("Case %d: %d\n",num++,res);
}
return 0;
}