题意:
p门课程n个学生,下面给出每门课程的学生数量和编号
问能否每门课选出课代表
每名学生只能担任一门课的课代表
思路:
裸的匈牙利算法,没什么好说的了
/* *********************************************** //Author :devil //Created Time :2016/5/10 16:8:32 //************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; const int N=305; vector<int>eg[N]; int link[N]; bool vis[N]; bool dfs(int u) { for(int i=0;i<eg[u].size();i++) { int v=eg[u][i]; if(!vis[v]) { vis[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=u; return 1; } } } return 0; } int main() { //freopen("in.txt","r",stdin); int t,p,n,l,x; scanf("%d",&t); while(t--) { scanf("%d%d",&p,&n); memset(link,-1,sizeof(link)); for(int i=1;i<=100;i++) eg[i].clear(); for(int i=1;i<=p;i++) { scanf("%d",&l); while(l--) { scanf("%d",&x); eg[i].push_back(x); } } int ans=0; for(int i=1;i<=p;i++) { memset(vis,0,sizeof(vis)); ans+=dfs(i); } if(ans==p) printf("YES "); else printf("NO "); } return 0; }