POJ 3020 Antenna Placement
这题一开始真的不知道该怎么建图,由此出现了一系列的问题。
题目大意:
一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市。问至少放置多少个基站才能使得所有的城市都覆盖无线?
还要考虑到匹配不到的点,最后答案就成了:所有点数-匹配数/2。
下面是代码:
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; const int M=405; int n,k,map1[M][M],vis[M],link[M],m,cut1[M][M]; bool dfs(int x) { for(int y=1; y<=n; y++) { if(map1[x][y] && !vis[y]) { vis[y]=true; if(link[y]==0 || dfs(link[y])) { link[y]=x; return true; } } } return false; } void hungray() { int i; for(i=1; i<=n; i++) { memset(vis,false,sizeof(vis)); if(dfs(i)) { m++; } } } int main() { int t,w,h; scanf("%d",&t); char s; while(t--) { int i,j,cut=0;; scanf("%d%d",&h,&w); memset(map1,0,sizeof(map1)); memset(cut1,0,sizeof(cut1)); memset(link,0,sizeof(link)); for(i=0; i<h; i++) { for(j=0; j<w; j++) { cin >> s; if(s=='*') { cut++; cut1[i][j]=cut; } } } n=cut; for(i=0; i<h; i++) { for(j=0; j<w; j++) { if(cut1[i][j]!=0) { if(i>0&&cut1[i-1][j]!=0) { map1[cut1[i][j]][cut1[i-1][j]]=1; } if(i<h-1&&cut1[i+1][j]!=0) { map1[cut1[i][j]][cut1[i+1][j]]=1; } if(j>0&&cut1[i][j-1]!=0) { map1 [cut1[i][j]] [cut1[i][j-1]] =1; } if(j<w-1&&cut1[i][j+1]!=0) { map1 [cut1[i][j]] [cut1[i][j+1]] =1; } } } } m=0; hungray() ; printf("%d\n",cut-m/2); } return 0; }