用的匈牙利算法
对于二分图,有个公式
最大独立团=总端点数-最小覆盖数
而 最小覆盖数=最大匹配数
所以懂的都懂
上代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<vector>
#include<set>
#include<queue>
#include<list>
#include<map>
using namespace std;
const int maxi = 1000;
int mp[maxi][maxi], used[maxi],who[maxi];
int n;
void init() {
memset(mp, 0, sizeof(mp));
memset(used, 0, sizeof(used));
memset(who,-1,sizeof(who));
}
int dfs(int u) {
for(int i=0;i<n;i++){
if(mp[u][i]&&!used[i]){
used[i]=1;
if(who[i]==-1||dfs(who[i])){
who[u]=i;
who[i]=u;
return 1;
}
}
}
return 0;
}
void solve() {
int ans = 0;
for (int i = 0; i < n; i++) {
memset(used,0,sizeof(used));
if(who[i]==-1){
if(dfs(i))ans++;
}
}
cout << n-ans << endl;
}
void read() {
while (cin >> n) {
init();
string str;
int to;
for (int i = 0; i < n; i++) {
cin >> str >> str;
int l = str.find("(");
int k = stoi(str.substr(l + 1, str.length() - 1 - l));
for (int j = 0; j < k; j++) {
cin >> to;
mp[i][to] = 1;
}
}
solve();
}
}
int main() {
read();
}