求二分图最大匹配题。题意:有N个学生和P个课程。每个学生都能选择任意多个课程,也可以不选择课程。你的任务是确定是否有可能组成这样的一个委员会使得
1.每一个委员会里的学生都代表一门不同的课程(前提是这个学生选了这门课程)
2.每个课程在委员会里都有且只有一个代表
现在给你每个学生选择的课程,如果能组成这样的委员会则输出“YES”,否则输出“NO”。
我的解题思路:求二分图的最大匹配,如果最大匹配数等于课程数那么输出“YES”,否则输出“NO”。
我的解题代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define N 303
int match[N];
bool vis[N];
vector <int> e[N];
int p, n;
void InitRead();
void DataProcess();
bool Dfs(int x);
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
InitRead();
DataProcess();
}
return 0;
}
void InitRead()
{
scanf("%d %d", &p, &n);
memset(match, -1, sizeof(match));
int a, b;
for (int i=1; i<=p; ++i)
{
e[i].clear();
scanf("%d", &a);
while (a--)
{
scanf("%d", &b);
e[i].push_back(b);
}
}
return;
}
void DataProcess()
{
int ans = 0;
for (int i=1; i<=p; ++i)
{
memset(vis, false, sizeof(vis));
if (Dfs(i)) ans++;
}
printf("%s\n", ans == p ? "YES" : "NO");
return;
}
bool Dfs(int x)
{
int size = e[x].size();
for (int i=0; i<size; ++i)
{
if (!vis[e[x][i]])
{
vis[e[x][i]] = true;
if (match[e[x][i]] == -1 || Dfs(match[e[x][i]]))
{
match[e[x][i]] = x;
return true;
}
}
}
return false;
}