题意:其实不太懂。。。给出课程数,学生数。然后给出学生的选课情况,求最大匹配数是否等于课程数。
#include<iostream>
using namespace std;
int link[300];
bool g[300][300],vis[300];
int n,m;
bool dfs(int u)
{
int v;
for(v=1;v<=m;v++)
if(g[u][v]&&!vis[v])//相连且未被访问
{
vis[v]=1;
if(link[v]==-1||dfs(link[v]))//如果是未盖点,或者有增广路
{
link[v]=u;//配集M中,和y中v相连的是x中的u
return true;
}
}
return false;
}
int maxmatch()
{
int u,ans=0;
memset(link,-1,sizeof(link));//初始化为未盖点
for(u=1;u<=n;u++)
{
memset(vis,0,sizeof(vis));
if(dfs(u)) ans++;//如果找到一条增光路,匹配数加一
}
return ans;
}
int main()
{
int N,count,i,j,a;
scanf("%d",&N);
while(N--)
{
memset(g,0,sizeof(g));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&count);
for(j=1;j<=count;j++)
{
scanf("%d",&a);
g[i][a]=1;
}
}
if(n==maxmatch()) printf("YES\n");
else printf("NO\n");
}
}