zoukankan      html  css  js  c++  java
  • HDU 2819 Swap

    二分图匹配+输出方案

    #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;
    int ansFrom[MAXN],ansTo[MAXN];
    int Tot;
    
    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))
        {
            memset(g,0,sizeof g);
            
            nx=n,ny=n;Tot=0;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                {
                    int x;
                    scanf("%d",&x);
                    if(x==1) g[i][j]=1;
                }
                
            if(MaxMatch()!=n) printf("-1
    ");
            else
            {
                int f=0;                
                for(int i=1;i<=n;i++)
                {
                    for(int j=1;j<=n;j++)
                        if(cx[j]==i)
                        {
                            if(i!=j)
                            {
                                ansFrom[f]=j;
                                ansTo[f]=i;
                                f++;
                                
                                swap(cx[j],cx[i]);
                            }
                            break;
                        }
                }
                printf("%d
    ",f);
                for(int i=0;i<f;i++)
                    printf("R %d %d
    ",ansFrom[i],ansTo[i]);
            }
        }
        return 0;
    }
  • 相关阅读:
    判断二叉树是否BST
    树基础训练(一)
    Trie 简介
    二叉树的一些补充
    红黑树
    平衡二叉树(AVL)介绍及其实现
    二叉查找树(BST)的实现
    二叉树基本知识
    微信小程序提示框
    urllib3使用指南
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4845423.html
Copyright © 2011-2022 走看看