poj3020 Antenna Placement 二分图最大匹配,最小覆盖点

转自http://blog.csdn.net/qq_33362864/article/details/52101883

#include <iostream>  
#include <cstdio>  
#include <algorithm>  
#include <cmath>  
#include <queue>  
#include <vector>  
#include <cstring>  
#include <string>  
using namespace std;  
const int MAXN=400+5;  
int vis[MAXN],match[MAXN];  
char tu[45][15];  
int p[45][15];  
int n,m;  
vector<int>head[MAXN];  
  
int dfs(int u)  
{  
    int i;  
    int l=head[u].size();  
    for(i=0; i<l; ++i)  
    {  
        int v=head[u][i];  
        if(!vis[v])  
        {  
            vis[v]=1;  
            if(match[v]==-1||dfs(match[v]))  
            {  
                match[v]=u;  
                return 1;  
            }  
        }  
    }  
    return 0;  
}  
  
int main()  
{  
    int t;  
    int i,j;  
    scanf("%d",&t);  
    while(t--)  
    {  
        int cnt=0;  
        scanf("%d%d",&n,&m);  
        for(i=0; i<n; ++i)  
        {  
            scanf("%s",tu[i]);  
            for(j=0; j<m; ++j)  
            {  
                if(tu[i][j]=='*')  
                {  
                    head[cnt].clear();//用容器就要记得清0  
                    p[i][j]=cnt++;  相当于给每个城市都标上序号 
                }  
            }  
        }  
        memset(match,-1,sizeof(match));  
        for(i=0; i<n; ++i)  
            for(j=0; j<m; ++j)  
            {  
                if(tu[i][j]=='*')//如果这是个城市,那么延伸4个方向,如果存在城市就加一条边  
                {  
                    if(i-1>=0&&tu[i-1][j]=='*')head[p[i][j]].push_back(p[i-1][j]);  
                    if(j-1>=0&&tu[i][j-1]=='*')head[p[i][j]].push_back(p[i][j-1]);  
                    if(i+1<n&&tu[i+1][j]=='*')head[p[i][j]].push_back(p[i+1][j]);  
                    if(j+1<m&&tu[i][j+1]=='*')head[p[i][j]].push_back(p[i][j+1]);  
                }  
            }  
        int sum=0;  
        for(i=0; i<cnt; ++i)  
        {  
            memset(vis,0,sizeof(vis));  
            if(dfs(i))sum++;  
        }  
        printf("%d\n",cnt-sum/2);  
    }  
    return 0;  
}  

posted @ 2018-03-12 19:41  LandingGuys  阅读(132)  评论(0编辑  收藏  举报