poj3020
来源:互联网 发布:2017淘宝开店营业执照 编辑:程序博客网 时间:2024/04/30 09:17
该题是二分图的最小路径覆盖问题,用匈牙利算法可以求得二分图的最大匹配数,然后用|V|-最大匹配数。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define maxnum 405using namespace std;struct Point{ int x,y;};Point point[maxnum];//记录下二分图其中一边的顶点,另一边的顶点也是一样的 int v;int visit[maxnum];//该点是否被访问 int match[maxnum];//该点匹配的点,未被匹配为-1 int path(int u){ for(int i=0;i<v;i++){ int temp=abs(point[i].x-point[u].x)+abs(point[i].y-point[u].y); if(i!=u&&temp==1&&!visit[i]){ visit[i]=1; if(match[i]==-1||path(match[i])){ match[i]=u; return 1; } } } return 0;}int main(){ int casenum;cin>>casenum; int h,w; while(casenum--){ memset(match,-1,sizeof(match)); cin>>h>>w;getchar(); char temp;int k=0; for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ temp=getchar(); if(temp=='*'){ point[k].x=j;point[k].y=i; k++; } } getchar(); } v=k; int count=0; for(int i=0;i<v;i++){ memset(visit,0,sizeof(visit)); if(path(i)){ count=count+1; } } cout<<k-count/2<<endl;// 这里将求得的最大匹配数除以二是因为顶点i和j匹配,j和i匹配结果是一样的,被重复考虑了。所以实际的最大匹配数是所求除以二。 }}
阅读全文
0 0
- poj3020
- poj3020
- poj3020
- POJ3020
- poj3020
- poj3020
- Poj3020
- POJ3020
- poj3020
- POJ3020 Antenna Placement
- poj3020 Antenna Placement
- poj3020 Antenna Placement
- Antenna Placement poj3020
- poj3020-二分图匹配
- poj3020-Antenna Placement
- POJ3020 Antenna Placement
- poj3020(最小边覆盖)
- poj3020 匈牙利算法+建图
- Python学习之Tkinter
- 《机器学习实战》学习笔记1
- OperationalError: (2006, 'MySQL server has gone away')
- 安装集成PHP开发环境出现“计算机中丢失 MSVCR110.dll”问题
- 模板(线段树 + 树状数组 + 单点查询 + 区间查询)eg:HDU 1754
- poj3020
- NKOJ 3545 接近(DP+单调队列)
- 异常:Caused by:java.net.ConnectException:Connection refused: connect
- 签到第一篇播客
- TLD算法,opencv3,vs2015
- jQuery简单练习(2)
- 二叉排序树
- 翻转单词顺序
- 局部变量作用域