自己写的板子就是好用,这道题是求的最大独立集不是最大匹配(英语弱渣),没看懂题调了半天代码找不到错。。GG
最大独立集 = n - (最大匹配 / 2)
#include<iostream>
#include<vector>
#include<memory.h>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
struct Hungary {
int n, vis[maxn], link[maxn];
vector <int> edge[maxn]; // 存下边
void init(int n)
{
this -> n = n;
memset(link, -1, sizeof(link));
for(int i = 0;i <= n;i ++)
edge[i].clear();
}
void addEdge(int s, int t)
{
edge[s].push_back(t);
edge[t].push_back(s);
}
int find(int k)
{
for(int i = 0;i < edge[k].size();i ++)
{
int t = edge[k][i];
if(vis[t] == 0)
{
vis[t] = 1;
if(link[t] == -1 || find(link[t]))
{
link[t] = k;
return 1;
}
}
}
return 0;
}
int maxmatch()
{
int ans = 0;
for(int i = 1;i <= n;i ++)
{
memset(vis, 0, sizeof(vis));
if(find(i)) ans ++;
}
return ans;
}
}Match;
int main()
{
int n;
while(~scanf("%d", &n))
{
Match.init(n);
int a, b, c;
for(int j = 0;j < n;j ++)
{
scanf("%d: (%d)", &a, &b);
for(int i = 0;i < b;i ++)
{
scanf("%d", &c);
Match.addEdge(a + 1, c + n + 1);
}
}
printf("%d\n", n - (Match.maxmatch() >> 1));
}
return 0;
}