POJ 3020 Antenna Placement(最小边覆盖)

来源:互联网 发布:python是面向对象语言 编辑:程序博客网 时间:2024/05/28 09:33
其实应该1A的,有个循环上线写错了。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=500+5;char map[50][50];int id[maxn][maxn];bool line[maxn][maxn],used[maxn*maxn];int gril[maxn*maxn];int m,n;int cnt;bool find(int x)  {      for(int j=1;j<=cnt;j++)      {          if(line[x][j]&&!used[j])          {              used[j]=true;              if(gril[j]==-1||find(gril[j]))              {                  gril[j]=x;                  return true;              }          }      }      return false;  }  int main(){    int t;    scanf("%d",&t);    while(t--)    {        cnt=0;        memset(line,false,sizeof(line));        memset(gril,-1,sizeof(gril));        scanf("%d%d",&m,&n);        for(int i=1;i<=m;i++) scanf("%s",map[i]+1);        for(int i=1;i<=m;i++){            for(int j=1;j<=n;j++){                if(map[i][j]=='*') id[i][j]=++cnt;            }        }        for(int i=1;i<=m;i++)        {            for(int j=1;j<=n;j++)            {                if(map[i][j]=='*')                {                    if(i-1>0&&map[i-1][j]=='*') line[ id[i][j] ][ id[i-1][j] ]=true;                    if(j-1>0&&map[i][j-1]=='*') line[ id[i][j] ][ id[i][j-1] ]=true;                    if(i+1<=m&&map[i+1][j]=='*') line[ id[i][j] ][ id[i+1][j] ]=true;                    if(j+1<=n&&map[i][j+1]=='*') line[ id[i][j] ][ id[i][j+1] ]=true;                }            }        }        int ans=0;        for(int i=1;i<=cnt;i++)        {            memset(used,false,sizeof(used));            if(find(i)) ans+=1;        }        printf("%d\n",cnt-ans/2);    }    return 0;}

0 0