Antenna Placement POJ - 3020
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Antenna Placement POJ - 3020相关的知识,希望对你有一定的参考价值。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
const int MAXN= 500000;//最大顶点数
const int MAXM = 11000;//最大边数
const int INF=0x3f3f3f3f;
using namespace std;
bool used[MAXN];
int linker[MAXN],index[500][500];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int tot;
char s[500][500];
int e[MAXN*2],ne[MAXN*2],idx,h[MAXN*2];
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
bool dfs(int x){
for(int i=h[x];i!=-1;i=ne[i]){
int v=e[i];
if(!used[v]){
used[v]=true;
if(linker[v]==-1||dfs(linker[v])){
linker[v]=x;
return true;
}
}
}
return false;
}
int hungry(){
int res=0;
memset(linker,-1,sizeof(linker));
for(int i=0;i<tot;i++){
memset(used,false,sizeof(used));
if(dfs(i)) res++;
}
return res;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
idx=0;
tot=0;
memset(h,-1,sizeof h);
memset(index,-1,sizeof(index));
scanf("%d%d ",&n,&m);
for(int i=0;i<n;i++){
gets(s[i]);
for(int j=0;j<m;j++)
if(s[i][j]=='*')
index[i][j]=tot++;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(index[i][j]!=-1){
for(int k=0;k<4;k++){
int x=i+dir[k][0];
int y=j+dir[k][1];
if(x>=0&&x<n&&y>=0&&y<m&&index[x][y]!=-1)
add( index[i][j],index[x][y] );
}
}
}
}
int res=hungry();
printf("%d
",tot-res/2);
}
return 0;
}
以上是关于Antenna Placement POJ - 3020的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3020 Antenna Placement 最大匹配
POJ3020 Antenna Placement(二分图最小路径覆盖)