poj3020 Antenna Placement 匈牙利算法求最小覆盖=最大匹配数(自身对应自身情况下要对半) 小圈圈圈点
2017-07-20 20:48
239 查看
/** 题目:poj3020 Antenna Placement 链接:http://poj.org/problem?id=3020 题意: 给一个由'*'或者'o'组成的n*m大小的图,你可以用一个小圈圈圈住两个相邻的'*',问要圈住所有的'*'最少需要多少个小圈圈。(小圈圈可以相交) 思路: 先尽量圈出能圈两个且不重复圈的'*'。剩下的没有圈的'*'一定需要用一个。 所以构造二分图,求最大匹配,结果:ans = 总的'*'数量-最大匹配数*2 + 最大匹配数 = 总的'*'数量-最大匹配数; 用自身对应自身构造的二分图,求得的最大匹配数要对半才是上面要求的最大匹配数。 */ #include<iostream> #include<cstdio> #include<algorithm> #include<map> #include<vector> #include<queue> #include<set> #include<cstring> using namespace std; const int MAXN = 405;///n*m=400 int f[MAXN][MAXN]; int vit[MAXN], S[MAXN], T[MAXN]; int N; ///模板 bool Find(int x)///走交替路,寻找增广路 { for(int i = 1; i <= N; i++){///n表示右侧点数。 if(f[x][i]&&vit[i]==0){ vit[i] = 1; if(T[i]==0||Find(T[i])){ T[i] = x;///右边第i个点和左边第x个点匹配成功。 S[x] = i;///左边第x个点和右边第i个点匹配成功。 return true; } } } return false; } char str[42][12]; int main() { int n, m, k; cin>>k; while(k--){ scanf("%d%d",&n,&m); N = n*m; for(int i = 1; i <= n; i++){ scanf("%s",str[i]+1); } memset(f, 0, sizeof f); memset(S, 0, sizeof S); memset(T, 0, sizeof T); int cnt = 0;///'*'的个数 for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(str[i][j]=='*'){ cnt++; if(j+1<=m&&str[i][j+1]=='*'){///向右边,和下边找,以免重复。 f[(i-1)*m+j+1][(i-1)*m+j] = f[(i-1)*m+j][(i-1)*m+j+1] = 1;///两边都是相同的数据,所以最大匹配数结果是两倍。 ///最终要除以2。 } if(i+1<=n&&str[i+1][j]=='*'){ f[i*m+j][(i-1)*m+j] = f[(i-1)*m+j][i*m+j] = 1; } } } } int ans = 0; for(int i = 1; i <= N; i++){ memset(vit, 0, sizeof vit); if(Find(i)) ans++; } printf("%d\n",cnt-2*(ans/2)+(ans/2));/// cnt - ans/2; } return 0; }
相关文章推荐
- poj3041 最小点覆盖即最大匹配(匈牙利算法)(模板)
- 匈牙利算法,求最大匹配数即最小顶点覆盖
- HDU 2063 过山车(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- poj3041 最小点覆盖==二分图最大匹配 匈牙利算法求解最大匹配问题(运用DFS)
- 最小点集覆盖与最大匹配之匈牙利算法
- 匈牙利算法,求最大匹配数即最小顶点覆盖
- hdu 1054 Strategic Game(模板) 最大二分匹配,最小点覆盖 匈牙利算法
- POJ3041《Asteroids》方法:匈牙利算法(最小点覆盖数==最大二分匹配数)
- 匈牙利算法 hdu 1151有向图的最小路径覆盖=顶点数-最大匹配数
- 彻底搞定二分图的匈牙利算法,最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖
- poj 3020 最小边覆盖与最大匹配 匈牙利算法
- POJ3041 最小点覆盖 最大匹配数 回顾匈牙利算法
- HDOJ---1151 Air Raid[匈牙利算法:最小路径覆盖数=原图顶点数–二分图最大匹配数]
- POJ 3041 匈牙利算法 最小覆盖 最大二分匹配
- poj3020 匈牙利算法+公式:二分无向图的最小路径覆盖 = 顶点数 - 最大二分匹配数 / 2
- poj 1325 Machine Schedule(最小点覆盖即最大匹配,匈牙利算法)
- HDU 1150 Machine Schedule(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- 二分图系列•二分图判定•匈牙利算法二分图的最大匹配•二分图最小点覆盖及最大独立集
- uva11419 【最大二分匹配求最小点覆盖 匈牙利算法】
- 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)