输入课程数p和学生数q.然后是p行,每行开头是这门课选的人数n,之后n个学生编号。问是否每个人都能找到自己喜欢的课.每门课只能被选一次哟
匈牙利算法是二分图中最经典的算法了.主要思想是当匹配第n个课程时.依次看n的连线.如果遇到可连的就直接连接.不可连接就看看想连接但是已经有对象的人是不是可以换个人连接233333.
#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <map>
#define xh(i,m,n) for(int i=m;i<=n;i++)
#define se(w) scanf("%lf",&w)
#define ss(o) scanf("%s",o)
#define sd(q) scanf("%d",&q)
using namespace std;
int s,d,f[305][305],vis[305],p[305];
int dfs(int c)
{
xh(i,1,d)
{
if(!vis[i]&&f[i][c])
{
vis[i]=1;
if(!p[i]||dfs(p[i]))
{
p[i]=c;
return 1;
}
}
}
return 0;
}
int main()
{
int ans,k;sd(k);
while(k--)
{ ans=0;
memset(p,0,sizeof(p));
memset(f,0,sizeof(f));
sd(s);sd(d);
xh(i,1,s)
{
int n;sd(n);
xh(j,1,n)
{
int peo;sd(peo);
f[peo][i]=1;
}
}
xh(i,1,s)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans+=1;
}
if(ans==s)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}