求二分图的最大独立集。题意:在大学的第二年有人开始研究男女学生之间的“浪漫”关系,所谓“浪漫”关系是在男女学生之间的,给你每个学生的编号以及他们之间的浪漫关系,请你找出一个最大的学生集合,使得这个集合里任意两个学生之间没有浪漫关系,求这个集合的学生人数。
我的解题思路:这是赤裸裸的求二分图最大独立集,根据二分图的最大独立集等于二分图的点数减去二分图的最大匹配数则可以得到答案。
我的解题代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define N 501
vector <int> e[N];
int match[N];
bool vis[N];
int n;
void InitRead();
void DataProcess();
bool Dfs(int x);
int main()
{
while (~scanf("%d", &n))
{
InitRead();
DataProcess();
}
return 0;
}
void InitRead()
{
memset(match, -1, sizeof(match));
int x, y;
for (int i=0; i<n; ++i)
{
e[i].clear();
scanf("%*d: (%d)", &x);
while (x--)
{
scanf("%d", &y);
e[i].push_back(y);
}
}
return;
}
void DataProcess()
{
int ans = 0;
for (int i=0; i<n; ++i)
{
memset(vis, false, sizeof(vis));
if (Dfs(i)) ans++;
}
printf("%d\n", n - ans / 2);
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;
}