标签:acm
点击打开链接题目链接
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 7386 | Accepted: 3651 |
Description
Input
Output
Sample Input
2 7 9 ooo**oooo **oo*ooo* o*oo**o** ooooooooo *******oo o*o*oo*oo *******oo 10 1 * * * o * * * * * *
Sample Output
17 5
**代表城市
在城市上可以放基站 一个基站可以提供2个相邻城市的信号
问让所有城市都有信号最少需要的基站数
二分图匹配
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int maps[444][444];
bool g[444][444];
int link[444];
bool vis[444];
char str[444][444];
int cnt;
int h,w;
void build(){
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(str[i][j]=='*'){
if(i>0&&str[i-1][j]=='*')
g[maps[i][j]][maps[i-1][j]]=g[maps[i-1][j]][maps[i][j]]=1;
if(i<h-1&&str[i+1][j]=='*')
g[maps[i][j]][maps[i+1][j]]=g[maps[i+1][j]][maps[i][j]]=1;
if(j>0&&str[i][j-1]=='*')
g[maps[i][j]][maps[i][j-1]]=g[maps[i][j-1]][maps[i][j]]=1;
if(j<w-1&&str[i][j+1]=='*')
g[maps[i][j]][maps[i][j+1]]=g[maps[i][j+1]][maps[i][j]]=1;
}
}
}
}
bool finds(int x){
for(int j=0;j<cnt;j++){
if(g[x][j]&&!vis[j]){
vis[j]=1;
if(link[j]==-1||finds(link[j])){
link[j]=x;
return 1;
}
}
}
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
cnt=0;
scanf("%d %d",&h,&w);
for(int i=0;i<h;i++){
scanf("%s",str[i]);
for(int j=0;j<w;j++){
if(str[i][j]=='*')
maps[i][j]=cnt++;
}
}
memset(g,0,sizeof(g));
build();
int res=0;
memset(link,-1,sizeof(link));
for(int i=0;i<cnt;i++){
memset(vis,0,sizeof(vis));
if(finds(i))
res++;
}
printf("%d\n",cnt-res/2);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
poj 3020 Antenna Placement 二分图匹配
标签:acm
原文地址:http://blog.csdn.net/qq_16843991/article/details/47088805