二分图最大独立集 = 全集-最小路径覆盖集
最小路径覆盖集 = 最大匹配
匈牙利算法:
#include<stdio.h>
#include<string.h>
int g[301][301], vis[301], match[301], cnt;
int n,m;
int dfs(int v){
int i;
for(i=1;i<=n;i++){
if(!vis[i]&&g[v][i]){
vis[i]=1;
if(dfs(match[i])||!match[i]){
match[i]=v;
return 1;
}
}
}
return 0;
}
void max_match()
{
int i;
memset(match,0,sizeof(match));
for(i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
cnt++;
}
}
int main()
{
int t,a,b,i,k,j,v,cas=0;
while(scanf("%d%d%d", &m, &n, &k), m, n, k){
cnt=0;
cas++;
memset(g, 1, sizeof(g));
for(i=1; i<=k; i++){
scanf("%d%d", &a, &b);
g[a][b] = 0;
}
max_match();
printf("Case %d: %d\n", cas, m+n-cnt);
}
return 0;
}