把不认识的两两相连。
那么,最后所求为最大独立集=n-最大匹配。。。
匈牙利算法:
#include <iostream>
using namespace std;
int g[205][205];
int vis[205];
int link[205];
int gr,b,m;
int dfs(int u)
{
for(int i=1;i<=b;i++)
if( !vis[i] && g[u][i] )
{
vis[i]=1;
if( link[i]==-1 || dfs(link[i]) )
{
link[i]=u;
return 1;
}
}
return 0;
}
int main()
{
int t=1;
while(scanf("%d %d %d",&gr,&b,&m)==3&&(gr||b||m))
{
memset(g,1,sizeof(g));
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d %d",&a,&b);
g[a][b]=0;
}
int ans=0;
memset(link,-1,sizeof(link));
for(int i=1;i<=gr;i++)
{
memset(vis,0,sizeof(vis));
ans+=dfs(i);
}
printf("Case %d: %d\n",t++,gr+b-ans);
}
return 0;
}