题意:g个女生互相认识,b个男生互相认识,m对男女互相认识,要求找出最大的互相认识的集合。
思路:一头雾水,上网搜他人博客,写法简单,但不是很理解。
盗来点东西:
独立集:任意两点都不相连的顶点的集合
独立数:独立集中顶点的个数
完全子图:任意两点都相连的顶点的集合
最大完全数:最大完全子图中顶点的个数
最大完全数=原图的补图的最大独立数
最大独立数=顶点数-最大匹配数
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int m,n,k,ans;
int p[201][201];
int l[201];
bool vis[402];
bool go(int u)
{
for(int i=1;i<=n;i++)
{
if(!vis[i]&&p[u][i]==-1)
{
vis[i]=1;
if(l[i]==-1||go(l[i]))
{
l[i]=u;
return true;
}
}
}
return false;
}
int main()
{
int ca=1;
while(scanf("%d%d%d",&m,&n,&k))
{
if(!m&&!n&&!k)break;
memset(l,-1,sizeof(l));
memset(p,-1,sizeof(p));
int u,v;
for(int i=0;i<k;i++)
{
scanf("%d%d",&u,&v);
p[u][v]=0;
}
ans=0;
for(int i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
if(go(i))ans++;
}
cout<<"Case "<<ca++<<": ";
cout<<m+n-ans<<endl;
}
}