题意:p门课,每门课有若干学生,要为每门课分配一名课代表,每个学生只能担任一门课的课代表,若每个课都能找到课代表,则输出"YES",否则"NO"。
分析:二分图的最大匹配,对课程、学生关系建立一个图,进行二分图最大匹配,当最大匹配数==课程数时说明能够满足要求,否则不能。
#include<iostream> using namespace std; #define N 303 bool cs[N][N]; //cs[i][j]表示学生j是否选i这个课程 int link[N]; //link[i]=j表示j课程的课代表是i bool ha[N]; //代表学生是否已当选某个课代表 int p,n; bool Find(int x) //为课程x分配课代表 { int i; for(i=1;i<=n;i++) if(!ha[i] && cs[x][i]==1) //若i学生还没有担任课代表并且选了x课程 { ha[i]=true; if(!link[i]||Find(link[i])) //i还未担任过课代表或者其担任的课代表可以找到别人担任 { link[i]=x; return true; } } return false; } int main() { int i,T,x,sum,m; cin>>T; while(T--) { cin>>p>>n; memset(cs,false,sizeof(cs)); for(i=1;i<=p;i++) { cin>>m; while(m--) cs[i][cin>>x,x]=true; } sum=0; memset(link,false,sizeof(link)); for(i=1;i<=p;i++) //为每个课程分配课代表 { memset(ha,false,sizeof(ha)); //每次选择课代表时,每个学生都要从头考虑,直到找到合适的课代表为止 if(Find(i)) sum++; } if(sum==p) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
原文地址:http://blog.csdn.net/a809146548/article/details/46359633