ZOJ 1137 Girls and Boys(二分图最大独立集)
2013-05-08 22:25
477 查看
二分图的最大独立集=顶点数-二分图的最大匹配数
二分图的最小顶点覆盖=二分图的最大匹配数
二分图的最小路径覆盖=顶点数-二分图的最大匹配数
因为这里用的是拆点的方法把图改造的二分图,所以最后的结果应该是 n - 二分图的最大匹配数/2
二分图的最小顶点覆盖=二分图的最大匹配数
二分图的最小路径覆盖=顶点数-二分图的最大匹配数
因为这里用的是拆点的方法把图改造的二分图,所以最后的结果应该是 n - 二分图的最大匹配数/2
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int maxn = 2000; struct edeg{ int v, next; }es[maxn * 2]; int head[maxn], fa[maxn], n; bool vis[maxn]; void addEdge(int u, int v, int eidx){ es[eidx].v = v; es[eidx].next = head[u]; head[u] = eidx; } bool dfs(int u){ for (int ne = head[u]; ne != -1; ne = es[ne].next){ int v = es[ne].v; if(!vis[v]){ vis[v] = 1; if(fa[v] == 0 || dfs(fa[v])){ fa[v] = u; return true; } } } return false; } int hungary(){ int ans = 0; memset(fa, 0, sizeof(fa)); for (int i = 0; i < n; ++i){ memset(vis, 0, sizeof(vis)); if(dfs(i)){ ans++; } } return ans; } int main(){ while (scanf("%d", &n) == 1){ memset(head, -1, sizeof(head)); int eidx = 0; for (int i = 0; i < n; ++i){ int u, m,v; scanf("%d: (%d)", &u, &m); while (m--){ scanf("%d", &v); addEdge(u, n + v, eidx++); } } printf("%d\n",n -hungary() / 2); } return 0; }
相关文章推荐
- POJ 1466 && ZOJ 1137--Girls and Boys【二分图 && 最大点独立集】
- zoj 1137 Girls and Boys 二分图的最大独立集
- zoj - 1137 - Girls and Boys(二分图最大独立点集)
- hdu 1068 zoj 1137 poj 1466 Girls and Boys(二分图匹配 匈牙利算法 最大独立集)
- hdu 1068 girls and boys(二分图求最大独立集)
- hdu1068 Girls and Boys (二分图最大独立集)
- POJ1466 Girls and Boys(二分图最大点独立集)
- HDU1068/POJ1466_Girls and Boys(二分图/最大独立集=N-最大匹配)
- POJ 1466 Girls and Boys(二分图最大独立集)
- zoj 1137 Girls and Boys(poj 1466)(最大独立点集)
- POJ - 1466 Girls and Boys 二分图+最大独立集
- HDU 1068 Girls and Boys (二分图最大独立集)
- (step6.3.2)hdu 1068(Girls and Boys——二分图的最大独立集)
- HDU 1068 Girls and Boys 二分图 最大独立集 字符串
- POJ 1466 Girls and Boys【二分图_最大独立集】
- POJ-1466-Girls and Boys(二分图最大独立集)
- POJ 1466:Girls and Boys 二分图的最大点独立集
- HDU 1068 Girls and Boys 二分图最大独立集(最大二分匹配)
- HDU1068,POJ1466——Girls and Boys(二分图最大独立集)
- HDOJ题目1068Girls and Boys(二分图最大独立集,匈牙利算法模板)