hdu 2819 Swap 二分图的最大匹配

来源:互联网 发布:阿里云 淘宝账号 编辑:程序博客网 时间:2024/05/23 19:12
//hdu 2819//直接按照给定的矩阵建图//判断匹配是否能达到n//然后选择排序确定交换顺序。#include<cstdio>#include<cstring>#include<iostream>using namespace::std;const int INF=0x7fffffff;const int N=110;int g[N][N];int L[N],R[N];struct Hungary{    int used[N],line[N];    void init(){        memset(line,-1,sizeof(line));    }    bool find(int u,int n){        for(int i=0;i<n;i++){            if(g[u][i]&&!used[i]){                used[i]=true;                if(line[i]==-1||find(line[i],n)){                    line[i]=u;                    return 1;                }            }        }        return 0;    }    int Max_match(int n){        int all=0;        for(int i=0;i<n;i++){            memset(used,0,sizeof(used));            if(find(i,n))all+=1;        }        return all;    }};Hungary huy;int main(){    int n;    while(scanf("%d",&n)!=EOF){        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){                scanf("%d",&g[i][j]);            }        }        huy.init();        int ans=huy.Max_match(n);        if(ans<n){            printf("-1\n");        }        else{            int cnt=0;            for(int i=0;i<n;i++){//选择排序                for(int j=0;j<n&&huy.line[i]!=i;j++){                    if(huy.line[j]==i){                        L[++cnt]=i;R[cnt]=j;                        swap(huy.line[i],huy.line[j]);                        break;                    }                }            }            printf("%d\n",cnt);            for(int i=1;i<=cnt;i++)                printf("C %d %d\n",L[i]+1,R[i]+1);        }    }    return 0;}

0 0
原创粉丝点击