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;
}
#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;
}