当前位置: 代码迷 >> 综合 >> zoj - 1137 - Girls and Boys(二分图最大独立点集)
  详细解决方案

zoj - 1137 - Girls and Boys(二分图最大独立点集)

热度:90   发布时间:2024-01-10 13:47:01.0

题意:二分图求最大独立点集。

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1137

——>>匈牙利算法直接A……最大独立点集的元素个数 = 总元素个数 - 最大匹配数(开始做的时候总输不对样例的结果,原来题意理解反了,是求最大独立点集,而不是最大匹配数,Enhlish……)

#include <cstdio>
#include <vector>
#include <cstring>using namespace std;const int maxn = 10000 + 10;
vector<int> G[maxn];
int fa[maxn];
bool vis[maxn];bool dfs(int u)
{int d = G[u].size();for(int i = 0; i < d; i++){int v = G[u][i];if(!vis[v]){vis[v] = 1;int temp = fa[v];fa[v] = u;if(temp == -1 || dfs(temp)) return 1;fa[v] = temp;}}return 0;
}
int main()
{int n, i, u, v, cnt;while(~scanf("%d", &n)){for(i = 0; i < maxn; i++) G[i].clear();for(i = 0; i < n; i++){scanf("%d: (%d)", &u, &cnt);while(cnt--){scanf("%d", &v);G[u].push_back(v);G[v].push_back(u);}}memset(fa, -1, sizeof(fa));for(i = 0; i < n; i++){memset(vis, 0, sizeof(vis));dfs(i);}int sum = 0;for(i = 0; i < n; i++) if(fa[i] != -1) sum++;printf("%d\n", n-sum/2);}return 0;
}