(重)POJ 3020Antenna Placement

http://poj.org/problem?id=3020

呃。。。这个题不是很会,所以找了大神的博客做了参考,说得很详细

http://blog.csdn.net/lyy289065406/article/details/6647040

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std ;
const int maxn = 450 ;
int map[maxn][maxn] ;
int ID ;
int v1,v2 ;
int ma ;
bool city[maxn][maxn] ;
bool vist[maxn] ;
int link[maxn] ;
int dirr[4] = {-1,1,0,0} ;
int dirc[4] = {0,0,-1,1} ;
bool dfs(int x)
{
    for(int i = 1 ; i <= v2 ; i++)
    {
        if(city[x][i] && !vist[i])
        {
            vist[i] = true ;
            if(link[i] == 0 || dfs(link[i]))
            {
                link[i] = x ;
                return true ;
            }
        }
    }
    return false ;
}
void sea()
{
    for(int i = 1 ; i <= v1 ; i++)
    {
        memset(vist, 0,sizeof(vist)) ;
        if(dfs(i))
        ma++ ;
    }
    return  ;
}
int main()
{
    int t ;
    scanf("%d",&t) ;
    while(t--)
    {
        memset(map,0,sizeof(map)) ;
        memset(city,0,sizeof(city)) ;
        memset(link,0,sizeof(link)) ;
        ID = 0 ;
        ma = 0 ;
        int h,w ;
        scanf("%d %d",&h,&w) ;
        char temp ;
        for(int i = 1 ; i <= h ; i++)
        {
            for(int j = 1 ; j <= w ; j++)
            {
                cin>>temp ;
                if(temp == '*')
                map[i][j] = ++ ID ;
            }
        }
        for(int i = 1 ; i <= h ; i++)
        {
            for(int j = 1 ; j <= w ; j++)
            {
                if(map[i][j])
                {
                    for(int k = 0 ; k < 4 ; k++)
                    {
                        int x = i+dirr[k] ;
                        int y = j+dirc[k] ;
                        if(map[x][y])
                        city[map[i][j]][map[x][y]] = true ;
                    }
                }
            }
        }
        v1 = v2 = ID ;
        sea() ;
        printf("%d
",ID-ma/2) ;
    }
    return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3489756.html