Antenna Placement POJ - 3020

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
const int MAXN= 500000;//最大顶点数
const int MAXM = 11000;//最大边数
const int INF=0x3f3f3f3f;
using namespace std;
bool used[MAXN];
int linker[MAXN],index[500][500];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int tot;
char s[500][500];
int e[MAXN*2],ne[MAXN*2],idx,h[MAXN*2];
void add(int a,int b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++; 
}
bool dfs(int x){
    for(int i=h[x];i!=-1;i=ne[i]){
        int v=e[i];
        if(!used[v]){
            used[v]=true;
            if(linker[v]==-1||dfs(linker[v])){
                linker[v]=x;
                return true;
            }
        }
    }
    return false;
}
int hungry(){
    int res=0;
    memset(linker,-1,sizeof(linker));
    for(int i=0;i<tot;i++){
        memset(used,false,sizeof(used));
        if(dfs(i)) res++;
    }
    return res;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        idx=0;
        tot=0;
        memset(h,-1,sizeof h);
        memset(index,-1,sizeof(index));
        scanf("%d%d ",&n,&m);
        for(int i=0;i<n;i++){
            gets(s[i]);
            for(int j=0;j<m;j++)
                if(s[i][j]=='*')
                    index[i][j]=tot++;
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(index[i][j]!=-1){
                    for(int k=0;k<4;k++){
                        int x=i+dir[k][0];
                        int y=j+dir[k][1];
                        if(x>=0&&x<n&&y>=0&&y<m&&index[x][y]!=-1)
                            add( index[i][j],index[x][y] );
                    }
                }
            }
        }
        int res=hungry();
        printf("%d\n",tot-res/2);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/QingyuYYYYY/p/12430825.html
今日推荐