题意:N个学生 P 个课程 求最大匹配
3 3 //学生 课程 3 1 2 3 //课程1 匹配学生1 2 3 2 1 2 1 1
典型的匹配没什么好说的
#include<iostream>
using namespace std;
int p,n;
int map[500][500];
int pre[500];
int v[500];
int dfs(int k)
{
for(int i=1;i<=p;i++)
{
if(v[i]||!map[i][k]) //第i个人已经被上一个k课程给匹配了
continue;
v[i]=1;
if(pre[i]==-1||dfs(pre[i]))
{
pre[i]=k;
return 1;
}
}
return 0;
}
int main()
{
int t,x,y,count,i,j;
cin>>t;
while(t--)
{
cin>>p>>n;
memset(map,0,sizeof(map));
memset(pre,-1,sizeof(pre));
for(i=1;i<=p;i++)
{
cin>>x;
for(j=1;j<=x;j++)
{
cin>>y;
map[i][y]=1;
}
}
count=0;
for(i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
if(dfs(i))
count++;
}
if(count==p)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}