题目链接点击打开链接
题意:有N(<=300)个学生和p(<=100)门课程,每门课程可能有0个到N个学生去选。
现在我们判断是否可以找到p个学生,使得每个学生分别对应一门不同的课程!
思路:我现在对每一门课程去找到相匹配的学生,只要有一门课程找不到相匹配的学生,就说明不能找到满足条件的p个学生
#include<iostream>
#include<cstdio>
#include<cstring>
#define ma(k) memset(k,0,sizeof(k))
using namespace std;
int p,n;//分别表示课程数和学生数
int map[102][302];
int linker[302];//学生匹配的课程
bool use[302];//表示某个学生是否用过
bool dfs(int i)
{
for(int j=1;j<=n;j++)
if(map[i][j]&&!use[j])
{
use[j]=true;
if(linker[j]==-1||dfs(linker[j]))
{
linker[j]=i;
return true;
}
}
return false;
}
bool hungary()
{
memset(linker,-1,sizeof(linker));
for(int i=1;i<=p;i++)
{
memset(use,false,sizeof(use));
if(!dfs(i)) return false;//每门课程找到学生
}
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ma(map);
scanf("%d%d",&p,&n);
for(int i=1;i<=p;i++)
{
int k;
scanf("%d",&k);
for(int j=1;j<=k;j++)
{
int a;
scanf("%d",&a);
map[i][a]=1;
}
}
if(hungary())
printf("YES\n");
else printf("NO\n");
}
return 0;
}