poj 3020 Antenna Placement 二分匹配
2015-11-20 20:22
309 查看
[code]#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int MAXN=601*601+10; const int MAXM=601*601*2; struct Edge { int to,next; } edge[MAXM]; int head[MAXN],tot,mx[MAXN],cx[MAXN],cy[MAXN],mk[MAXN]; void addedge(int from,int to) { edge[tot].to=to; edge[tot].next=head[from]; head[from]=tot++; } void init() { memset(head,0xff,sizeof(head)); tot=0; } int dfs(int u) { for(int i=head[u]; i!=-1; i=edge[i].next) { int v=edge[i].to; if(!mk[v]) { mk[v]=1; if(cy[v]==-1||dfs(cy[v])) { cx[u]=v; cy[v]=u; return 1; } } } return 0; } int Maxmatch(int n) { int res=0; memset(cx,0xff,sizeof(cx)); memset(cy,0xff,sizeof(cy)); for(int i=1; i<=n; i++) { if(cx[i]==-1) { memset(mk,0,sizeof(mk)); res+=dfs(i); } } return res; } int main() { int _,n,m,i,j,k,u,v,g[50][50],num; char mp[50][50]; scanf("%d",&_); while(_--) { scanf("%d%d",&n,&m); init(); num=0; for(i=0;i<n;i++) scanf("%s",mp[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) if(mp[i][j]=='*') g[i][j]=++num; for(i=0;i<n;i++) for(j=0;j<m;j++) { if(mp[i][j]!='*') continue; if(mp[i+1][j]=='*'&&i+1<n) { addedge(g[i+1][j],g[i][j]); addedge(g[i][j],g[i+1][j]); } if(mp[i][j+1]=='*'&&j+1<m) { addedge(g[i][j+1],g[i][j]); addedge(g[i][j],g[i][j+1]); } } printf("%d\n",num-Maxmatch(num)/2); } return 0; }
相关文章推荐
- Fresco 使用笔记(一):加载gif图片并播放
- 南大软院大神养成计划--js
- HDOJ 2016 数据的交换输出
- Nginx配置服务器SSI
- 【Android】下拉刷新实现
- HDOJ 2016 数据的交换输出
- Linux 下用户(andy)创建的文件可让特定用户(alice)修改
- iOS检测联网
- Noip2015提高组总结
- 为mysql数据库建立索引
- ubuntu14.04,必须会的技能-安装PPA源中的程序,更大范围使用deb格式安装文件!!
- HDOJ 2015 偶数求和
- ubuntu14.04,必须会的技能-安装PPA源中的程序,更大范围使用deb格式安装文件!!
- ubuntu14.04,必须会的技能-安装PPA源中的程序,更大范围使用deb格式安装文件!!
- HDOJ 2015 偶数求和
- hihocoder-1055 刷油漆(树形DP)
- 医疗大数据预处理
- HDOJ 2014 青年歌手大奖赛_评委会打分
- HDOJ 2013 蟠桃记
- Nginx服务器配置404页面