Battle ships HDU - 5093 经典二分图匹配

Battle ships

HDU - 5093

http://acm.hdu.edu.cn/showproblem.php?pid=5093

注意数组大小, 因为分块所以要将匹配用到的数组开大点


#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
#define ms(x) memset(x, 0, sizeof(x))
using namespace std;
const int N = 53;
int a[N][N], b[N][N];
int used[N*N], linked[N*N][N*N], match[N*N ];
char s[N][N];
int n, m;
int p, q;
void creat_line(){
    p = 1;
    for(int i=0;i<n;i++){
        bool f = 0;
        for(int j=0;j<m;j++){
            if(s[i][j] =='*'){
                a[i][j] = p;
                f = 1;
            }
            else if(s[i][j] == '#'){
                if(j!=m-1)
                    p++;
                f = 0;
            }
        }
        p++;
    }
}
void creat_col(){
    q = 1;
    for(int j=0;j<m;j++){
        bool f = 0;
        for(int i=0;i<n;i++){
            if(s[i][j] =='*'){
                b[i][j] = q;
                f = 1;
            }
            else if(s[i][j] == '#'){
                if(i!=n-1)
                    q++;
                f = 0;
            }
        }
        q++;
    }
}
bool found(int x){
    for(int i=1;i<q;i++){
        if(!used[i] && linked[x][i]){
            used[i] = 1;
            if(match[i]==-1 || found(match[i])){
                match[i] = x;
                return 1;
            }
        }
    }
    return 0;
}
void init(){
    ms(a);
    ms(b);
    ms(linked);
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--){
        init();
        scanf("%d%d", &n, &m);
        for(int i=0;i<n;i++){
            scanf("%s", s[i]);
        }
        creat_col();
        creat_line();
//        for(int i=0;i<n;i++){
//            for(int j=0;j<m;j++){
//                printf("%d", a[i][j]);
//            }
//            printf("\n");
//        }
//        for(int i=0;i<n;i++){
//            for(int j=0;j<m;j++){
//                printf("%d", b[i][j]);
//            }
//            printf("\n");
//        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(s[i][j] == '*'){
                    linked[a[i][j]][b[i][j]] = 1;
                }
            }
        }
        memset(match, -1, sizeof(match));
        int ans = 0;
        for(int i=1;i<p;i++){
            ms(used);
            if(found(i)) ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/khn64/article/details/80185945