https://www.luogu.org/problemnew/show/2417
题目描述
n个学生去p个课堂,每一个学生都有自己的课堂,并且每个学生只能去一个课堂,题目要求能够安排每一个课堂都有人吗?
输入输出格式
输入格式:
第一行是测试数据的个数,
每组测试数据的开始分别是p和n,
接着p行,每行的开始是这个课堂的学生人数m,接着m个数代表该课堂的学生编号
输出格式:
如果该组数据能够这样安排就输出YES,否则输出NO。
输入输出样例
说明
对于100%的数据,n\le 100,m\le 20000n≤100,m≤20000
1 #include <cstring> 2 #include <cstdio> 3 4 inline void read(int &x) 5 { 6 x=0; register char ch=getchar(); 7 for(; ch>'9'||ch<'0'; ) ch=getchar(); 8 for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0'; 9 } 10 11 const int M(20005); 12 const int N(110); 13 14 int n,p,sumvis; 15 bool link[N][M]; 16 int vis[M],mat[M]; 17 18 bool find(int u) 19 { 20 for(int v=1; v<=n; ++v) 21 if(vis[v]!=sumvis&&link[u][v]) 22 { 23 vis[v]=sumvis; 24 if(!mat[v]||find(mat[v])) 25 { 26 mat[v]=u; 27 return 1; 28 } 29 } 30 return false; 31 } 32 33 inline bool work() 34 { 35 int m,cnt=0; 36 read(p),read(n); 37 for(int u=1; u<=p; ++u) 38 { 39 read(m); 40 for(int v; m--; ) 41 read(v),link[u][v]=1; 42 } 43 for(int i=1; i<=p; ++i) 44 { 45 sumvis++; 46 cnt+=find(i); 47 } 48 return cnt==p; 49 } 50 51 inline void init() 52 { 53 sumvis=0; 54 memset(mat,0,sizeof(mat)); 55 memset(vis,0,sizeof(vis)); 56 memset(link,0,sizeof(link)); 57 } 58 59 int Presist() 60 { 61 int t; read(t); 62 for(; t--; init()) 63 if(!work()) puts("NO"); 64 else puts("YES"); 65 return 0; 66 } 67 68 int Aptal=Presist(); 69 int main(int argc,char**argv){;}