poj3692Kindergarten 二分匹配之最大独立集

//g个girl , b个boy , gril都被彼此认识,boy也彼此认识
//有的girl和boy也彼此认识
//问最多能选出多少人,这些人都彼此认识
//对陌生人建立一个图
//那么其最大独立集就是最多的彼此认识的人
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 210 ;
int map[maxn][maxn] ;
int g , b , m;
int match[maxn] , vis[maxn] ;
int find(int st)
{
    for(int i = 1;i <= b;i++){
      if(!vis[i] && !map[st][i]){
         vis[i] = 1 ;
         if(match[i] == -1 || find(match[i])){
           match[i] = st ;
           return true ;
        }
      }
    }
  return false ;
}
int main()
{
    int cas =  0;
    while(scanf("%d%d%d" , &g , &b  ,&m) &&(g+b+m))
    {
        memset(match , -1 , sizeof(match)) ;
        memset(map, 0 , sizeof(map)) ;
        for(int i = 1 ;i <= m;i++)
        {
            int u ,v ;
            scanf("%d%d" , &u , &v) ;
            map[u][v] = 1;
        }
        int ans = 0 ;
        for(int i = 1;i <= g;i++)
        {
            memset(vis , 0 , sizeof(vis)) ;
            if(find(i))
            ans++ ;
        }
        printf("Case %d: " , ++cas) ;
        cout<<g+b-ans<<endl;
    }
    return 0 ;
}


你可能感兴趣的:(二分匹配)