UVALive 6525

二分图最大匹配

#include<cstdio>
#include<iostream>
#include<cstring>
#define MAX 10010

using namespace std ;


int n, t, n1, n2, g1[1100][1100], g2[1100][1100];
char s[110][110];

bool visit[MAX];
int match[MAX];
int head[MAX];

struct edge
{
    int to,next;
}e[300005];


void addedge(int u,int v)
{
    e[++t].to=v;
    e[t].next=head[u];
    head[u]=t;
}

void init ( )
{
     t = n1 = n2 = 0;
     memset(head, 0, sizeof(head));
     for(int i = 1; i <= n; ++ i)
         for(int j = 1; j <= n; ++ j)
            if(s[i][j] == '.') g1[i][j] = (s[i][j] != s[i][j-1]) ?  ++ n1 : g1[i][j-1];
    for(int i = 1; i <= n; ++ i)
         for(int j = 1; j <= n; ++ j)
            if(s[i][j] == '.') g2[i][j] = (s[i][j] != s[i-1][j]) ? ++ n2: g2[i-1][j];
     for(int i = 1; i <= n; ++ i)
         for(int j = 1; j <= n; ++ j)
            if(s[i][j] == '.') addedge(g1[i][j], g2[i][j]);
}
bool dfs(int u)
{
    int i,v;
    for(i = head[u]; i != 0; i = e[i].next)
    {
        v = e[i].to;
        if(!visit[v])
        {
            visit[v] = true;
            if(match[v] == -1 || dfs(match[v]))
            {
                match[v] = u;
                return true;
            }
        }
    }
    return false;
}
int MaxMatch()
{
    int i,sum=0;
    memset(match,-1,sizeof(match));
    for(i = 1 ; i <= n1 ; ++i)
    {
        memset(visit,false,sizeof(visit));
        if( dfs(i) )
        {
            sum++;
        }
    }
    return sum;
}
int main ( )
{
     while(scanf("%d", &n) == 1)
    {
         for(int i = 1; i <= n; ++ i)
            scanf("%s", s[i]+1);
         init();
         int ans = MaxMatch();
         printf("%d\n", ans);
     }
     return 0 ;
}


posted @ 2014-05-02 14:34  xlc2845  阅读(122)  评论(0)    收藏  举报