您的位置:首页 > 其它

POJ 3020 Antenna Placement

2016-08-09 15:32 232 查看
Source Code
#include <iostream>
#include <cstring>
using namespace std;
int map[40+5][10+5], next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int a[400+5][400+5], match[400+5];
bool vis[400+5];
int k;
bool fin(int x) {
for(int i=1;i<=k;i++) {
if(a[x][i]&&!vis[i]) {
vis[i]=1;
if(!match[i]||fin(match[i])) {
match[i]=x;
return 1;
}
}
}
return 0;
}
int main() {
int n, m, t;
cin>>t;
while(t--) {
cin>>n>>m;
k=0;
memset(map,0,sizeof(map));
memset(a,0,sizeof(a));
memset(match,0,sizeof(match));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
char temp;
cin>>temp;
if(temp=='*') map[i][j]=++k;
}
//        for(int i=1;i<=n;i++) {
//            for(int j=1;j<=m;j++)
//                cout<<map[i][j]<<' ';
//            cout<<endl;
//        }
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int l=0;l<4;l++){
int tx=i+next[l][0], ty=j+next[l][1];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&map[i][j]&&map[tx][ty])
a[map[i][j]][map[tx][ty]]=1;
}
int ans=0;
for(int i=1;i<=k;i++){
memset(vis,0,sizeof(vis));
if(fin(i)) ans++;
}
cout<<k-ans/2<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: