题意: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