标签:
Description
Input
Output
Sample Input
Sample Output
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 660;
const int INF = 0x3f3f3f3f;
vector<int>G[maxn];
int Mx[maxn], My[maxn], dx[maxn], dy[maxn], used[maxn], dis;
char Map[maxn][maxn];
int lis[maxn][maxn];
bool SearchP(int _n){
    queue<int>Q;
    memset(dx,-1,sizeof(dx));
    memset(dy,-1,sizeof(dy));
    int dis = INF;
    for(int i = 1; i <= _n; i++){
        if(Mx[i] == -1){
            dx[i] = 0;
            Q.push(i);
        }
    }
    int v;
    while(!Q.empty()){
        int u = Q.front(); Q.pop();
        if(dx[u] > dis) break;
        for(int i = 0; i < G[u].size(); i++){
            v = G[u][i];
            if(dy[v] == -1){
                dy[v] = dx[u] + 1;
                if(My[v] == -1){
                    dis = dy[v];
                }else{
                    dx[My[v]] = dy[v] + 1;
                    Q.push(My[v]);
                }
            }
        }
    }
    return dis != INF;
}
int dfs(int u){
    int v;
    for(int i = 0; i < G[u].size(); i++){
        v = G[u][i];
        if(!used[v] && dy[v] == dx[u] + 1){
            used[v] = 1;
            if(My[v] != -1 && dy[v] == dis){
                continue;
            }
            if(My[v] == -1 || dfs(My[v])){
                Mx[u] = v;
                My[v] = u;
                return true;
            }
        }
    }
    return false;
}
int MaxMatch(int ln,int rn){
    int ret = 0;
    memset(Mx,-1,sizeof(Mx));
    memset(My,-1,sizeof(My));
    while(SearchP(ln)){
        memset(used,0,sizeof(used));
        for(int i = 1; i <= ln; i++){
            if(Mx[i] == -1 && dfs(i)){
                ret++;
            }
        }
    }
    return ret;
}
int main(){
    int T, cas = 0, n, m, N;
    scanf("%d",&T);
    while(T--){
        n =  m = 0;
        scanf("%d",&N);
        int N2 = N*N;
        for(int i = 0; i <= N2; i++){
            G[i].clear();
        }
        for(int i = 0; i <= N+1; i++){
            Map[i][0] = ‘.‘;
            Map[0][i] = ‘.‘;
            Map[N+1][i] = ‘.‘;
            Map[i][N+1] = ‘.‘;
        }
        for(int i = 1; i<= N; i++){
            getchar();
            for(int j = 1; j <= N; j++){
                scanf("%c",&Map[i][j]);
                if(Map[i][j] == ‘#‘){
                    if((i+j)%2 == 0){
                        ++n;
                        lis[i][j] = n;
                        if(Map[i-1][j] == ‘#‘){
                            G[n].push_back(lis[i-1][j]);
                        }
                        if(Map[i][j-1] == ‘#‘){
                            G[n].push_back(lis[i][j-1]);
                        }
                    }else{
                        ++m;
                        lis[i][j] = m;
                        if(Map[i-1][j] == ‘#‘){
                            G[lis[i-1][j]].push_back(m);
                        }
                        if(Map[i][j-1] == ‘#‘){
                            G[lis[i][j-1]].push_back(m);
                        }
                    }
                }
            }
        }
        int res = MaxMatch(n,m);
        printf("Case %d: %d\n",++cas,res);
    }
    return 0;
}
/*
4
.##.
..#.
.###
....
4
.##.
..#.
.###
..#.
4
.##.
..#.
.###
...#
*/
HDU 4185 ——Oil Skimming——————【最大匹配、方格的奇偶性建图】
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4955467.html