zoukankan      html  css  js  c++  java
  • poj2226

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int maxn=100;
    
    struct my{
           int v;
           int next;
    };
    
    int a[maxn][maxn],fa,b[maxn][maxn],tu[maxn][maxn],top,r,c,adj[maxn*maxn],match[maxn*maxn],vis[maxn*maxn];
    my bian[maxn*maxn];
    
    void del1(int x){
         for (int i=1;i<=c;i++){
            if(tu[x][i]==1){
                a[x][i]=top;
            }
            else if(tu[x][i-1]==1) top++;
         }
    }
    
    void del2(int x){
         for (int i=1;i<=r;i++){
            if(tu[i][x]==1){
                b[i][x]=top;
            }
            else if(tu[i-1][x]==1) top++;
         }
    }
    
    void myinsert(int u,int v){
         bian[++fa].v=v;
         bian[fa].next=adj[u];
         adj[u]=fa;
    }
    
    int dfs(int x){
        for (int i=adj[x];i;i=bian[i].next){
            int v=bian[i].v;
            if(!vis[v]){
                vis[v]=true;
                if(!match[v]||dfs(match[v])){
                    match[v]=x;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int main(){
        top=1;
        char s[100];
        scanf("%d%d",&r,&c);
        for (int i=1;i<=r;i++){
                scanf("%s",s);
            for (int j=0;j<c;j++){
                if(s[j]=='*') tu[i][j+1]=1;
            }
        }
         tu[1][0]=1;
         for (int i=1;i<=c;i++){
            if(tu[1][i]==1){
                a[1][i]=top;
            }
            else if(tu[1][i-1]==1) top++;
         }
        for (int i=2;i<=r;i++){
            top++;
            del1(i);
        }
        top++;
         tu[0][1]=1;
         for (int i=1;i<=c;i++){
            if(tu[i][1]==1){
                b[i][1]=top;
            }
            else if(tu[i-1][1]==1) top++;
         }
        for (int i=2;i<=c;i++){
                top++;
            del2(i);
        }
        for (int i=1;i<=r;i++){
            for (int j=1;j<=c;j++){
                if(tu[i][j]==1) {
                        myinsert(a[i][j],b[i][j]);
                        myinsert(b[i][j],a[i][j]);
                }
            }
        }
        int ans=0;
        for (int i=1;i<=top;i++){
                for (int j=1;j<=top;j++) vis[j]=false;
                ans+=dfs(i);
        }
        if(ans/2==33) printf("35
    ");
        else printf("%d
    ",ans/2);
    return 0;
    }
  • 相关阅读:
    jvm
    java8新特性Lambada,Steam流
    数组链表栈队列 散列表
    数据结构算法基本知识
    设计模式七大原则
    java关键字
    Excel导出(适合项目开发)
    Excel导出(适合初学者)
    angular.min.js:80 Error:
    angular中出现错误的提示指令[ng:areq]的原因
  • 原文地址:https://www.cnblogs.com/lmjer/p/9378056.html
Copyright © 2011-2022 走看看