二分图最大匹配

19 篇文章 0 订阅
6 篇文章 0 订阅

POJ 1274 The Perfect Stall

#include <cstdio>
#include <cstring>

int n, m, map[210][210]; 
int state[210], link[210];  

bool find(int p){
    for(int i = 1; i <= m; i++){
     	if(map[p][i] && !state[i]){
            state[i] = 1;
            int j = link[i]; link[i] = p;
     	    if(j == -1 || find(j)) return true;
     	    link[i] = j;
             
             /*int j = link[i];
            if( j == -1 || find(j) ){
                link[i] = p; return true;
             }*/
        }
    }
    return false;
}

int main(){
    int si, tmp, ans;
    while(~scanf("%d %d", &n, &m)){
        memset(map, 0, sizeof(map)); 
        for(int i = 1; i <= n; i++){
            scanf("%d", &si);
            for(int j = 1; j <= si; j++){
	        scanf("%d", &tmp);
                map[i][tmp] = 1;
           }
        }   
        ans = 0;
        memset(link, -1, sizeof(link));
        for(int i = 1; i <= n; i++){
	        memset(state, 0, sizeof(state));
            if(find(i))   ans++;   
	    }
 	    printf("%d\n", ans);    
    }    
    return 0;
} 


POJ1469 COURSES

#include <cstdio>  
#include <cstring>  
      
int p, n, map[110][310];   
int state[310], link[310];    
      
bool find(int a){  
     for(int i = 1; i <= n; i++){  
          if(map[a][i] && !state[i]){  
              state[i] = 1;  
              int j = link[i]; link[i] = a;  
              if(j == -1 || find(j)) return true;  
              link[i] = j;  
          }  
     }  
     return false;  
 }  
      
int main(){  
     int cases, count, tmp, num; 
     scanf("%d", &cases); 
     while(cases--){
	     scanf("%d %d", &p, &n);  
          memset(map, 0, sizeof(map));   
          for(int i = 1; i <= p; i++){  
               scanf("%d", &count);  
               for(int j = 1; j <= count; j++){  
                    scanf("%d", &tmp);  
                    map[i][tmp] = 1;  
               }  
          }     
          num = 0;  
          memset(link, -1, sizeof(link));  
          for(int i = 1; i <= p; i++){  
               memset(state, 0, sizeof(state));  
               if(find(i))   num++;     
          }  
          if(num == p)   printf("YES\n");   
          else   printf("NO\n");   
     }      
     return 0;  
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值