二分图最大匹配

来源:互联网 发布:人生 知乎 编辑:程序博客网 时间:2024/05/01 11:23

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