标签:orm har ntp other contains 不同 pst cut lang
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 24192 | Accepted: 9426 |
Description
Input
Output
Sample Input
2
3 3
3 1 2 3
2 1 2
1 1
3 3
2 1 3
2 1 3
1 1
Sample Output
YES
NO
题目大意:一些课一些人,组成一个集体,集体中每人代表每门不同的课,每门课在集体中有一名成员,问是否能组成这样的集体
思路:
这个题我们只需要求出二分图的最大匹配数,这样我们求出他们选的课程数,然后判断最大匹配数是否等于课程总数。
代码:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 501 using namespace std; bool vis[N]; int t,w,n,m,x,ans,girl[N],map[N][N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) {if(ch==‘-‘) f=-1; ch=getchar();} while(ch<=‘9‘&&ch>=‘0‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int find(int x) { for(int i=1;i<=m;i++) { if(!vis[i]&&map[x][i]) { vis[i]=true; if(girl[i]==-1||find(girl[i])) {girl[i]=x;return 1;} } } return 0; } int main() { t=read(); while(t--) { ans=0; memset(map,0,sizeof(map)); n=read(),m=read(); for(int i=1;i<=n;i++) { w=read(); while(w--){x=read(),map[i][x]=1;} } if(m<n){printf("NO\n"); continue;} memset(girl,-1,sizeof(girl)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(find(i)) ans++; } if(ans==n) printf("YES\n"); else printf("NO\n"); } return 0; }
标签:orm har ntp other contains 不同 pst cut lang
原文地址:http://www.cnblogs.com/z360/p/7423950.html