- 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; }
POJ 3020 Antenna Placement
最新推荐文章于 2018-04-05 13:22:00 发布