zoukankan      html  css  js  c++  java
  • HDU 1045 Fire Net

    二分图的最大匹配

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    const int MAXN=505;
    int nx,ny;
    int g[MAXN][MAXN];
    int cx[MAXN],cy[MAXN];
    int mk[MAXN];
    int n;
    char Map[MAXN][MAXN];
    int L[MAXN][MAXN],R[MAXN][MAXN];
    
    int path(int u)
    {
        for(int v=1; v<=ny; v++)
        {
            if(g[u][v]&&!mk[v])
            {
                mk[v]=1;
                if(cy[v]==-1||path(cy[v]))
                {
                    cx[u]=v;
                    cy[v]=u;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int MaxMatch()
    {
        int res=0;
        memset(cx,-1,sizeof(cx));
        memset(cy,-1,sizeof(cy));
        for(int i=1; i<=nx; i++)
        {
            if(cx[i]==-1)
            {
                memset(mk,0,sizeof(mk));
                res=res+path(i);
            }
        }
        return res;
    }
    
    int main()
    {
        while(~scanf("%d",&n))
        {
            if(!n) break;
            nx=1,ny=1;
            memset(g,0,sizeof(g));
            for(int i=0; i<n; i++) scanf("%s",Map[i]);
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                    if(Map[i][j]=='X')
                        L[i][j]=-1,R[i][j]=-1;
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                {
                    if(Map[i][j]=='.') L[i][j]=nx;
                    if(Map[i][j]=='X') nx++;
                    if(j==n-1) nx++;
                }
            for(int j=0; j<n; j++)
                for(int i=0; i<n; i++)
                {
                    if(Map[i][j]=='.') R[i][j]=ny;
                    if(Map[i][j]=='X') ny++;
                    if(i==n-1) ny++;
                }
            nx--,ny--;
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                    if(Map[i][j]=='.')
                        g[L[i][j]][R[i][j]]=1;
            printf("%d
    ",MaxMatch());
        }
        return 0;
    }
  • 相关阅读:
    99%的人都理解错了HTTP中GET与POST的区别
    idea 使用
    一道java算法题
    记一次jedis并发使用问题JedisException: Could not return the resource to the pool
    我珍藏的神兵利器
    记一次诡异的debug
    spring cloud config
    spring mvc 集成quartz
    git使用下
    Mongo--03 mongo副本集、备份与恢复
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4784431.html
Copyright © 2011-2022 走看看