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

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);

    }

}

  

你可能感兴趣的:(ant)