題目連結點選打開連結
題意:有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;
}