HDU 4185 Oil Skimming

二分图的最大匹配

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;

const int MAXN=1505;
int linker[MAXN];
bool used[MAXN];
vector<int>map[MAXN];
int uN;
char m[MAXN][MAXN];
int tt[MAXN][MAXN];

bool dfs(int u)
{
    for(int i=0;i<map[u].size();i++)
    {
        if(!used[map[u][i]])
        {
            used[map[u][i]]=true;
            if(linker[map[u][i]]==-1||dfs(linker[map[u][i]]))
            {
                linker[map[u][i]]=u;
                return true;
            }
        }
    }
    return false;
}

int hungary()
{
    int u;
    int res=0;
    memset(linker,-1,sizeof(linker));
    for(u=0;u<uN;u++)
    {
        memset(used,false,sizeof(used));
        if(dfs(u)) res++;
    }
    return res;
}


int main()
{
    int T;
    int u,k,v;
    int n;
    scanf("%d",&T);
    for(int yy=1;yy<=T;yy++)
    {
        scanf("%d",&n); uN=0;
        memset(tt,-1,sizeof tt);
        for(int i=0;i<MAXN;i++) map[i].clear();
        for(int i=0;i<n;i++)scanf("%s",m[i]);

        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(m[i][j]=='#')
                    tt[i][j]=uN,uN++;

        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(tt[i][j]!=-1)
                {
                    if(j+1<n&&tt[i][j+1]!=-1) 
                    {
                        map[tt[i][j]].push_back(tt[i][j+1]);
                        map[tt[i][j+1]].push_back(tt[i][j]);
                    }
                    if(i+1<n&&tt[i+1][j]!=-1)
                    {
                        map[tt[i][j]].push_back(tt[i+1][j]);
                        map[tt[i+1][j]].push_back(tt[i][j]);
                    }
                }
        printf("Case %d: ",yy);
        printf("%d
",hungary()/2);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/4808003.html