计蒜客习题-城市规划 最小边覆盖集
2018-03-22 22:16
435 查看
不用管独立的居民区,统计点数的时候加进来就行了
由于是无向图 要插双向边
由于是无向图 要插双向边
//最小边覆盖集==最大点独立集==顶点数-最大匹配 //把地图交替染色 构建二分图 #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; #define p1 (i-1)*m+j-1 #define p2 (i-2)*m+j #define N n*m inline int read() { char c = getchar(); int s = 0, f = 1; while (c<'0' || c>'9') { if (c == '-') f = -1; c = getchar(); }while (c >= '0'&&c <= '9') { s = s * 10 + c - 48; c = getchar(); }return s*f; } int g[107][107], ans[10007], node[107][107], cnt = 0, n, m; vector<int> g2[10001]; bool vis[10007]; bool dfs(int u) { for (int i = 0; i <g2[u].size(); i++) { int v=g2[u][i]; if (!vis[v]) { //有边 vis[v] = true; if (ans[v] == -1 || dfs(ans[v])) { ans[v] = u; return true; } } } return false; } int hungary() { int res = 0; memset(ans, -1, sizeof(ans)); for (int i = 1; i <= cnt; i++) { memset(vis, false, sizeof(vis)); res += dfs(i); } return res; } int main() { n = read(); m = read(); char c = getchar(); for (int i = 1, j = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { while (c != 'o'&&c != '*') { c = getchar(); } if (c == '*') { node[i][j] = ++cnt; if (g[i - 1][j] == 1){ g2[node[i][j]].push_back(node[i - 1][j]); g2[node[i - 1][j]].push_back(node[i][j]); } if (g[i][j - 1] == 1) { g2[node[i][j]].push_back(node[i][j - 1]); g2[node[i][j - 1]].push_back(node[i][j]); } } g[i][j] = c == '*' ? 1 : 0; c = getchar(); } } printf("%d", (cnt * 2 - hungary()) >> 1); //getchar(); return 0; }
相关文章推荐
- 计蒜客习题-俄罗斯套娃 最小路径覆盖
- poj 2060 二分图 最小路径覆盖 出租车
- 树的最小支配集,最小点覆盖,最大独立集两种算法
- hdu 1054(最小顶点覆盖)
- poj 2125 最小点权覆盖
- (最小路径覆盖) poj 3020
- hiho一下 第三十五周 :二分图三·二分图最小点覆盖和最大独立集
- hdu_1054最小点覆盖树上
- POJ 3041 Asteroids (最小点覆盖)
- bzoj 1185: [HNOI2007]最小矩形覆盖 (旋转卡壳)
- hdu 4160 (Dolls)二分图的最小路径覆盖
- bzoj1337 最小圆覆盖 计算几何 解题报告
- poj 2594-flody + 最小路径覆盖
- HDU 1054 Strategic Game 最小顶点覆盖
- poj_1325_最小点覆盖
- Air Raid hdu 1151 最小路径覆盖
- 网络流之最小路径覆盖问题
- 【算法学习】最小路径覆盖
- 匹配问题(最大匹配,最小覆盖,最大独立集) 欢迎大家来讨论
- 最小点权覆盖集&最大点权独立集