poj 3020 Antenna Placement 匈牙利二分匹配 最小覆盖数 !!!!
2012-02-15 20:37
459 查看
这道题只要建立起二分图就好说了,我们可以将*对应他周边的*,这样剑气二分图,所需最小的覆盖数=* 的数量-匹配数量/2;
#include<iostream> using namespace std; int map[500][500],vis[500],pa[500],v[500][500]; char a[500][500]; int n; int find(int x) { for(int i=1;i<=n;i++) { if(!vis[i]&&map[x][i]) { vis[i]=1; if(pa[i]==-1||find(pa[i])) { pa[i]=x; return 1; } } } return 0; } int dis[4][2]={1,0,0,1,-1,0,0,-1};//控制4方向 int main() { int cases,h,w; while(cin>>cases) { while(cases--) { for(int i=0;i<500;i++) { for(int j=0;j<500;j++) map[i][j]=0; pa[i]=-1; } scanf("%d%d",&h,&w); n=h*w;//这个n是二分匹配时搜索的范围 for(int i=0;i<h;i++) scanf("%s",a[i]); int cou=1; for(int i=0;i<h;i++)//将*序列化存在v数组里 { for(int j=0;j<w;j++) { if(a[i][j]=='*') v[i][j]=cou++; } } for(int i=0;i<h;i++)//下面建图的过程 { for(int j=0;j<w;j++) { if(a[i][j]=='*') { for(int m=0;m<4;m++) { int mm=i+dis[m][1]; int nn=j+dis[m][0]; if(mm>=0&&mm<h&&nn>=0&&nn<w&&a[mm][nn]=='*') { map[v[i][j]][v[mm][nn]]=1; } } } } } int num=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(find(i)) num++; } // cout<<cou<<" "<<num; // system("pause"); printf("%d\n",cou-1-num/2); } } return 0; }
相关文章推荐
- poj3020 匈牙利算法+公式:二分无向图的最小路径覆盖 = 顶点数 - 最大二分匹配数 / 2
- POJ 1325 简单基础匈牙利二分匹配:最小点覆盖
- POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】
- poj 3020 最小边覆盖与最大匹配 匈牙利算法
- POJ-3020-Antenna Placement [二分匹配][最小路径覆盖]
- POJ 3020 最小路径覆盖 = 顶点数-最大匹配数 二分匹配
- POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】
- POJ 3041 匈牙利算法 最小覆盖 最大二分匹配
- poj-3041-Asteroids【二分匹配&&最小顶点覆盖】
- poj3020-Antenna Placement(最小路径覆盖问题,最大匹配)
- poj1422 Air Raid 二分匹配之最小路径覆盖
- poj 1325 Machine Schedule(最小点覆盖即最大匹配,匈牙利算法)
- poj 3041 Asteroids 最小顶点覆盖 && 二分匹配
- poj 3020 Antenna Placement (最小路径覆盖, 匈牙利算法, 拆点形成二分图)
- uva11419 【最大二分匹配求最小点覆盖 匈牙利算法】
- poj 3041 Asteroids(二分匹配,最小点覆盖)
- poj 3020 Antenna Placement(最小路径覆盖 + 匈牙利算法)
- Poj 1548 Robots【最小路径覆盖---二分匹配】
- POJ 3041 Asteroids 二分匹配 最小点覆盖
- POJ 2594 最大二分匹配 最小路径覆盖