lightoj 1304 The Best Contest Site Ever (二分匹配)

来源:互联网 发布:debug意思网络用语 编辑:程序博客网 时间:2024/05/16 07:21
/*分块  行的快为一方 列的为另一方进行匹配 */# include <stdio.h># include <algorithm># include <string.h>using namespace std;# define N 10010int tot;int head[N];int vis[N];int link[N];int uN;struct node{    int to;    int next;} Edge[N<<2];void addEdge(int u,int v){    Edge[tot].to=v;    Edge[tot].next=head[u];    head[u]=tot++;}int dfs(int x){    for(int i=head[x]; i!=-1; i=Edge[i].next)    {        int to=Edge[i].to;        if(!vis[to])        {            vis[to]=1;            if(link[to]==-1||dfs(link[to]))            {                link[to]=x;                return 1;            }        }    }    return 0;}int hungary(){    int ans=0;    memset(link,-1,sizeof(link));    for(int i=0; i<uN; i++)    {        memset(vis,0,sizeof(vis));        if(dfs(i))            ans++;    }    return ans;}int main(){    int n,m,i,j,t;    char a[110][110];    int hang[110][110],lie[110][110];    while(~scanf("%d",&t))    {        int cas=0;        while(t--)        {            memset(head,-1,sizeof(head));            tot=0;            scanf("%d%d",&n,&m);            for(i=0; i<n; i++)                scanf("%s",&a[i]);            int hh=0;            int ll=0;            memset(hang,0,sizeof(hang));            memset(lie,0,sizeof(lie));            for(i=0; i<n; i++)            {                for(j=0; j<m; j++)                {                    if(a[i][j]!='W')                    {                        hang[i][j]=hh;                        if(j==m-1)                            hh++;                    }                    else                    {                        if(j!=0&&a[i][j-1]!='#')                            hh++;                    }                }            }            for(i=0; i<m; i++)            {                for(j=0; j<n; j++)                {                    if(a[j][i]!='W')                    {                        lie[j][i]=ll;                        if(j==n-1)                            ll++;                    }                    else                    {                        if(j!=0&&a[j-1][i]!='W')                            ll++;                    }                }            }            uN=hh;            for(i=0; i<n; i++)            {                for(j=0; j<m; j++)                {                    if(a[i][j]=='.')                    {                        addEdge(hang[i][j],lie[i][j]);                    }                }            }            printf("Case %d: %d\n",++cas,hungary());            for(i=0; i<n; i++)            {                for(j=0; j<m; j++)                {                    if(a[i][j]=='.'&&link[lie[i][j]]==hang[i][j])                        a[i][j]='T';                }            }            for(i=0;i<n;i++)            {                for(j=0;j<m;j++)                    printf("%c",a[i][j]);                printf("\n");            }        }    }    return 0;}

0 0
原创粉丝点击