借着这道模板题学了下二分图(orz蒟蒻)。
题目大意是有p个课程和n个学生,每门课程会有k个学生愿意选择,但每个学生只能选择一门课程,问是否能使每门课程有且仅有一个学生。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn=301;
int match[maxn],p,n,ans,T;
bool flag,vis[maxn],g[maxn][maxn];
bool dfs(int t){
for (int i=1;i<=n;i++)
if (g[t][i] && !vis[i]){
vis[i]=1;
if (match[i]==-1 || dfs(match[i])) {
match[i]=t;
return 1;
}
}
return 0;
}
void init(){
int k,v;
scanf("%d %d",&p,&n);
memset(g,0,sizeof g);
flag=1;
for (int i=1;i<=p;i++){
scanf("%d",&k);
if (k==0) flag=0;
if (!flag) return ;
while (k--){
scanf("%d",&v);
g[i][v]=1;
}
}
memset(match,-1,sizeof match);
ans=0;
}
int main(){
scanf("%d",&T);
while (T--){
init();
if (!flag) {
cout<<"NO\n";
continue;
}
for (int i=1;i<=p;i++){
memset(vis,false,sizeof vis);
if (dfs(i)) ans++;
}
if (ans==p) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}