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?

InputThere 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.OutputFor 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

  1. 2
  2. 0 1
  3. 1 0
  4. 2
  5. 1 0
  6. 1 0

Sample Output

  1. 1
  2. R 1 2
  3. -1
  4.  
  5. 题意:给你一个n*n的棋盘,值都是01,你可以任意交换两行两列,不要求最少步数,交换的结果让对角线都为1
  6.  
  7. 思路:首先我们可以看出如果可以交换出结果,只依靠行交换或者列交换即可,然后我们要求的是一条对角线,意思是每列匹配的位置必须是固定的行,
    我们把行当做二分图的左边,列当做二分图的右边,1的时候就是行和列直接有一条边,
    -1问题我们直接用匈牙利算法求出,求出最大匹配是否是n,如果不是的话,说明有些行还没有匹配,所以不符合要求,如果最大匹配是n的话
    我们可以去找属于自己的列,如图

说明满足第一行的匹配在第二列,但是我现在匹配的是第三列,这个时候就要把这两列交换一下,得到以下结果

这个时候第二行匹配错了,所以2,3行交换,然后得到的结果就匹配完成了

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. struct sss
  7. {
  8. int x,y;
  9. }a[];
  10. int n;
  11. int mp[][];
  12. int vis[];
  13. int girl[];
  14. int dfs(int x)
  15. {
  16. for(int i=;i<=n;i++)
  17. {
  18. if(mp[x][i]&&vis[i]==)
  19. {
  20. vis[i]=;
  21. if(girl[i]==||dfs(girl[i]))
  22. {
  23. girl[i]=x;
  24. return ;
  25. }
  26. }
  27. }
  28. return ;
  29. }
  30. int main()
  31. {
  32. while(scanf("%d",&n)!=EOF)
  33. {
  34. memset(girl,,sizeof(girl));
  35. for(int i=;i<=n;i++)
  36. {
  37. for(int j=;j<=n;j++)
  38. scanf("%d",&mp[i][j]);
  39. }
  40. int sum=;
  41. for(int i=;i<=n;i++)
  42. {
  43. memset(vis,,sizeof(vis));
  44. sum+=dfs(i);
  45. }
  46. if(sum!=n) printf("-1\n");//看是否满足全部匹配到了
  47. else{
  48. int num=;
  49. for(int i=;i<=n;i++)
  50. {
  51. if(i!=girl[i])//灵活利用girl数组记录了匹配的行
  52. {
  53. for(int j=i+;j<=n;j++)//如果当前行匹配出错,找出需要匹配的行在哪里
  54. {
  55. if(i==girl[j])
  56. {
  57. int t;
  58. t=girl[i];
  59. girl[i]=girl[j];
  60. girl[j]=t;
  61. a[num].x=i;
  62. a[num].y=j;
  63. num++;
  64. break;
  65. }
  66. }
  67. }
  68. }
  69. printf("%d\n",num);
  70. for(int i=;i<num;i++)
  71. {
  72. printf("C %d %d\n",a[i].x,a[i].y);
  73. }
  74. }
  75. }
  76. }
  1.  

HDU - 2819 Swap(二分图最大匹配)的更多相关文章

  1. HDU 2819 ——Swap——————【最大匹配、利用linker数组、邻接表方式】

     Swap Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  2. HDU 2819 - Swap - [二分图建模+最大匹配]

    题目链接:https://cn.vjudge.net/problem/HDU-2819 Given an N*N matrix with each entry equal to 0 or 1. You ...

  3. HDU - 2819 Swap (二分图匹配-匈牙利算法)

    题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...

  4. HDU 2819 Swap(行列式性质+最大匹配)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2819 题目大意:给你一个n*n的01矩阵,问是否可以通过任意交换整行或者整列使得正对角线上都是1. ...

  5. HDU 2819 Swap(二分图匹配)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2819 [题目大意] 给出一个棋盘,由白格子和黑格子组成,可以交换棋盘的行列, 使得其主对角线为黑格 ...

  6. E - Swap - hdu 2819(简单二分图匹配)

    题意:如果可以交换行列,问主对角线能不能全为1 分析:要想主对角线全为1很明显要有N个行列不想同的点就行了,可以用二分图匹配计算出来多能有几个.如果小与N就不能.输出要是对的就行,不必和答案一样 ** ...

  7. hdu 2819 Swap

    Swap http://acm.hdu.edu.cn/showproblem.php?pid=2819 Special Judge Problem Description Given an N*N m ...

  8. HDU 2819 — Swap 二分匹配

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU 2063 (二分图最大匹配)

    RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩 ...

随机推荐

  1. win10系统同时安装python2和python3

    1.官网下载python2和python3版本 2.安装python3,勾上Add Python3.5 to PATH,自定义选择安装目录,安装,验证:WIN+R--->cmd,输入python ...

  2. vux, vue上拉加载更多

    <template> <" :bottom-method="loadBottom" :bottom-all-loaded="bottomAll ...

  3. XXE漏洞

    原理:XML外部实体注入,简称XXE漏洞,XML数据在传输中数据被修改,服务器执行被恶意插入的代码.当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取.系统命令执行.内网端口探测.攻击内网 ...

  4. 漏洞复现——apache文件解析漏洞

    漏洞描述: 我们可以上传一个文件名末尾包含换行符的文件,以此绕过它的黑名单 影响版本: apache 2.4.0-2.4.29 漏洞分析: <FilesMath "\.(?i:php| ...

  5. loj#6062. 「2017 山东一轮集训 Day2」Pair hall定理+线段树

    题意:给出一个长度为 n的数列 a和一个长度为 m 的数列 b,求 a有多少个长度为 m的连续子数列能与 b匹配.两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对当 ...

  6. java 类加载机制和反射机制

    一.类的加载机制 jvm把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成jvm可以直接使用的java类型的过程.(1)加载         将class文件字节码内容加载到内存中, ...

  7. JQ 实现监测input中值的变化并绑定到另个input

                    $('#input').bind('input propertychange', function () {                     $('#myDiv ...

  8. Leetcode 1005. K 次取反后最大化的数组和

    1005. K 次取反后最大化的数组和  显示英文描述 我的提交返回竞赛   用户通过次数377 用户尝试次数413 通过次数385 提交次数986 题目难度Easy 给定一个整数数组 A,我们只能用 ...

  9. 338. Counting Bits_比特位计数_简单动态规划

    https://leetcode.com/problems/counting-bits/ 这是初步了解动态规划后做的第一道题,体验还不错... 看完题目要求后,写出前10个数的二进制数,发现了以下规律 ...

  10. 使用深度学习检测TOR流量——本质上是在利用报文的时序信息、传输速率建模

    from:https://www.jiqizhixin.com/articles/2018-08-11-11 可以通过分析流量包来检测TOR流量.这项分析可以在TOR 节点上进行,也可以在客户端和入口 ...