二分图匹配 匈牙利算法 hdu 4185

来源:互联网 发布:渐变颜色搭配的数据 编辑:程序博客网 时间:2024/06/08 15:24
#include<stdio.h>  #include<string.h>  #include<iostream>#define ll long long#define N 300010using namespace std;int e[1000][1000];int map2[1000][1000];char map1[1000][1000];int book[1000];int f[1000];int cont;int dfs(int x){    for(int i=0;i<cont;i++)    {        if(e[x][i]&&!book[i])        {            book[i]=1;            if(f[i]==-1||dfs(f[i]))            {                f[i]=x;                return 1;            }        }    }    return 0;}int main(){    int t,tt=0;    scanf("%d",&t);    while(t--)    {tt++;    memset(e,0,sizeof(e));        int n;        scanf("%d",&n);        cont=0; //getchar();        for(int i=0;i<n;i++)        {            scanf("%s",map1[i]);            for(int j=0;j<n;j++)            {             //scanf(" %c",&map1[i][j]);                if(map1[i][j]=='#')                {                    map2[i][j]=cont++;                }            }        }        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)        {            if(map1[i][j]!='#')                continue;            if(j-1>=0&&map1[i][j-1]=='#')                 e[map2[i][j]][map2[i][j-1]]=1;                 if(j+1<n&&map1[i][j+1]=='#')                    e[map2[i][j]][map2[i][j+1]]=1;                 if(i+1<n&&map1[i+1][j]=='#')                    e[map2[i][j]][map2[i+1][j]]=1;                    if(i-1>=0&&map1[i-1][j]=='#')                    e[map2[i][j]][map2[i-1][j]]=1;        }        memset(f,-1,sizeof(f));        int ans=0;        for(int i=0;i<cont;i++)        {            memset(book,0,sizeof(book));            if(dfs(i))ans++;        }        printf("Case %d: ",tt);        printf("%d\n",ans/2);    }}

原创粉丝点击