poj 3020 Antenna Placement(二分图+最小路径覆盖)

马虎了一下,少些了个=号,错了N 遍
http://poj.org/problem?id=3020
#include<stdio.h>
#include<string.h>
#define N 1000
int a,h,w;
char str[N][N];
int map[N][N],vis[N],result[N];
int bian(int x,int y)
{
    if(x>=0&&x<=h&&y>=0&&y<=w)
    {
        if(str[x][y]=='*')
    {
        return x*w+y;
    }
    return -1;
    }
    return -1;



}
void link(int x,int y)
{
     a=bian(x,y);
    if(bian(x-1,y)!=-1)
    {
        int b=bian(x-1,y);
        map[a][b]=1;

    }
    if(bian(x,y+1)!=-1)
    {
        int b=bian(x,y+1);
        map[a][b]=1;

    }
    if(bian(x+1,y)!=-1)
    {
        int b=bian(x+1,y);
        map[a][b]=1;

    }
    if(bian(x,y-1)!=-1)
    {
        int b=bian(x,y-1);
        map[a][b]=1;

    }

}
int  dfs(int x)
{

    int i;
    for(i=0;i<=a;i++)
    {
        if(!vis[i]&&map[x][i]==1)
        {
            vis[i]=1;
            if(result[i]==0||dfs(result[i]))
            {
                result[i]=x;
                return 1;

            }
        }
    }
    return 0;

}
int main()
{
    int l,i,j,sum;
    scanf("%d",&l);
    while(l--)
    {
        scanf("%d%d",&h,&w);
        memset(result,0,sizeof(result));
        memset(map,0,sizeof(map));
        sum=0;
        getchar();
        for(i=0;i<h;i++)
        {
            scanf("%s",str[i]);
        }
        for(i=0;i<h;i++)
        {
            for(j=0;j<w;j++)
            {
                if(str[i][j]=='*')
                {
                    link(i,j);
                    sum++;
                }
            }
        }

        int ans=0;
        for(i=0;i<=a;i++)
        {
            memset(vis,0,sizeof(vis));
            if(dfs(i))ans++;
        }

        printf("%d\n",sum-ans/2);
    }
}

  

原文地址:https://www.cnblogs.com/acSzz/p/2384138.html