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



posted @ 2013-08-12 10:17  、小呆  阅读(96)  评论(0编辑  收藏  举报