题目描述
n个学生去p个课堂,每一个学生都有自己的课堂,并且每个学生只能去一个课堂,题目要求能够安排每一个课堂都有人吗?
输入输出格式
输入格式:
第一行是测试数据的个数,
每组测试数据的开始分别是p和n,
接着p行,每行的开始是这个课堂的学生人数m,接着m个数代表该课堂的学生编号
输出格式:
如果该组数据能够这样安排就输出YES,否则输出NO。
输入输出样例
输入样例#1:
2 3 3 3 1 2 3 2 1 2 1 1 3 3 2 1 3 2 1 3 1 1
输出样例#1:
YES NO
裸的二分图,不多说,发上来常看看就可以了
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int n,m,t; int head[401],size; struct Edge { int next,to; }edge[60001]; void putin(int from,int to) { size++; edge[size].next=head[from]; edge[size].to=to; head[from]=size; } int match[30001]; bool vis[401]; bool dfs(int root) { int i; for(i=head[root];i!=-1;i=edge[i].next) { int y=edge[i].to; if(!vis[y]) { vis[y]=1; if(match[y]==0||dfs(match[y])) { match[root]=y; match[y]=root; return 1; } } } return 0; } int maxmatch(int m) { int ans=0,i; for(i=1;i<=m;i++) { memset(vis,0,sizeof(vis)); ans+=dfs(i); } return ans; } int main() { int i,j,k,s; scanf("%d",&t); while(t--) { memset(head,-1,sizeof(head)); memset(match,0,sizeof(match)); scanf("%d%d",&m,&n); for(i=1;i<=m;i++) { scanf("%d",&k); for(j=1;j<=k;j++) { scanf("%d",&s); putin(i,m+s); //putin(m+i,s); } } int ans=maxmatch(m); if(ans==m)printf("YES\n"); else printf("NO\n"); } return 0; }