• ACM HDU 2819 Swap (二分图匹配,记录过程)


    Swap

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 459    Accepted Submission(s): 129
    Special Judge


    Problem Description
    Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. Can you find a way to make all the diagonal entries equal to 1?
     

    Input
    There are several test cases in the input. The first line of each test case is an integer N (1 <= N <= 100). Then N lines follow, each contains N numbers (0 or 1), separating by space, indicating the N*N matrix.
     

    Output
    For each test case, the first line contain the number of swaps M. Then M lines follow, whose format is “R a b” or “C a b”, indicating swapping the row a and row b, or swapping the column a and column b. (1 <= a, b <= N). Any correct answer will be accepted, but M should be more than 1000.

    If it is impossible to make all the diagonal entries equal to 1, output only one one containing “-1”.
     

    Sample Input
    2 0 1 1 0 2 1 0 1 0
     

    Sample Output
    1 R 1 2 -1
     

    Source
     

    Recommend
    gaojie
     
     
    #include<stdio.h>
    #include
    <string.h>
    const int MAXN=105;
    int uN,vN; //u,v数目
    int g[MAXN][MAXN];//编号是0~n-1的
    int linker[MAXN];
    bool used[MAXN];
    int a[10000],b[10000];
    bool dfs(int u)
    {
    int v;
    for(v=1;v<=vN;v++)
    if(g[u][v]&&!used[v])
    {
    used[v]
    =true;
    if(linker[v]==-1||dfs(linker[v]))
    {
    linker[v]
    =u;
    return true;
    }
    }
    return false;
    }
    int hungary()
    {
    int res=0;
    int u;
    memset(linker,
    -1,sizeof(linker));
    for(u=1;u<=uN;u++)
    {
    memset(used,
    0,sizeof(used));
    if(dfs(u)) res++;
    }
    return res;
    }
    int main()
    {
    int N;
    int i,j,u,v;
    while(scanf("%d",&N)!=EOF)
    {
    uN
    =vN=N;
    for(i=1;i<=uN;i++)
    for(j=1;j<=vN;j++)
    scanf(
    "%d",&g[i][j]);
    int ans=hungary();
    //printf("%d\n",ans);
    if(ans<N){printf("-1\n");continue;}
    int res=0;
    for(i=1;i<=uN;i++)
    {
    for(j=i;j<=vN;j++)
    if(linker[j]==i) break;
    if(j!=i)
    {
    a[res]
    =i;b[res++]=j;
    int t=linker[i];linker[i]=linker[j];linker[j]=t;
    }
    }
    printf(
    "%d\n",res);
    for(i=0;i<res;i++)
    printf(
    "C %d %d\n",a[i],b[i]);


    }
    return 0;
    }

  • 相关阅读:
    如何免费做一个属于自己稳定有效的图床
    关于自己每日计划是如何制定的
    记一次买4K显示器的心酸历程
    Mac常用的软件推荐
    2019 一整年的总结与一些个人反思
    Lucene学习笔记: 五,Lucene搜索过程解析
    Lucene学习笔记: 四,Lucene索引过程分析
    lucene学习笔记:三,Lucene的索引文件格式
    lucene学习笔记:二,Lucene的框架
    Lucene学习笔记:一,全文检索的基本原理
  • 原文地址:https://www.cnblogs.com/kuangbin/p/2134985.html
Copyright © 2020-2023  润新知