题意:通过交换行或者列来实现对角线(左上角到右下角)上都是1,

首先,如果某行全是0或者某列全是0必然不满足情况输出-1,如果能转换的话,那么必然可以通过全由行(列)变换得到;

还有就是对角线上的N个1,它们各自在不同的行中出现至少一次才可以,

比如样例2中,虽然有两个1,但是它们总是处在同一列,仍然不满足要求,

很明显不能一个行对应两个列,或者说,每一行都应该有至少一个与自己对应的列才能满足条件;

那么将行作为X集合,列作为Y集合,如果map[i][j]==1,那么Xi->Yj连边,求最大匹配,这样的话没有任何一个行被两个列匹配,也就满足了我们的要求,

如果最大匹配==N,那么必然有解,否则必然无解;

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<queue>
  6. #include<string>
  7. #include<stack>
  8. #include<map>
  9. using namespace std;
  10. #define N 1100
  11. #define INF 0x3f3f3f3f
  12. #define met(a, b) memset(a, b, sizeof(a))
  13.  
  14. int used[N], G[N][N], vis[N], n;
  15.  
  16. int Find(int u)
  17. {
  18. for(int i=; i<=n; i++)
  19. {
  20. if(!vis[i] && G[u][i])
  21. {
  22. vis[i] = ;
  23. if(!used[i] || Find(used[i]))
  24. {
  25. used[i] = u;
  26. return ;
  27. }
  28. }
  29. }
  30. return ;
  31. }
  32.  
  33. int main()
  34. {
  35. while(scanf("%d", &n) != EOF)
  36. {
  37. met(G, );
  38.  
  39. for(int i=; i<=n; i++)
  40. {
  41. for(int j=; j<=n; j++)
  42. {
  43. int op;
  44. scanf("%d", &op);
  45. G[i][j] = op;
  46. }
  47. }
  48. int ans = ;
  49. met(used, );
  50. for(int i=; i<=n; i++)
  51. {
  52. met(vis, );
  53. ans += Find(i);
  54. }
  55. if(ans < n)
  56. {
  57. printf("-1\n");
  58. continue;
  59. }
  60. int cnt = , a[N]={}, b[N]={};
  61.  
  62. ///相当于是给一个数组used排序的过程,使得交换的次数最少;
  63. ///每次把i位置上的数,放到应该放的位置,直到当前位置是对应的数为止;
  64. for(int i=; i<=n; i++)
  65. {
  66. while(i != used[i])
  67. {
  68. a[cnt] = i;
  69. b[cnt] = used[i];
  70. swap(used[i], used[used[i]]);
  71. cnt ++;
  72. }
  73. }
  74.  
  75. printf("%d\n", cnt);
  76. for(int i=; i<cnt; i++)
  77. printf("C %d %d\n", a[i], b[i]);
  78. }
  79. return ;
  80. }
  81. /*
  82. 3
  83. 0 1 1
  84. 0 0 1
  85. 1 0 0
  86. */

Swap---hdu2819(最大匹配)的更多相关文章

  1. HDU2819 Swap —— 二分图最大匹配

    题目链接:https://vjudge.net/problem/HDU-2819 Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  2. Swap[HDU2819]

    SwapTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission ...

  3. HDU - 2819 Swap(二分图最大匹配)

    Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. C ...

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

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

  5. hdu2819 Swap 最大匹配(难题)

    题目大意: 给定一个元素的值只有1或者0的矩阵,每次可以交换两行(列),问有没有方案使得对角线上的值都是1.题目没有限制需要交换多少次,也没限制行交换或者列交换,也没限制是主对角线还是副对角线.虽然没 ...

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

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

  7. hdu-2819.swap(二分匹配 + 矩阵的秩基本定理)

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

  8. hdu1281+hdu2819(最大匹配数)

    分析:将行和列缩点,即行对应二分图的X部,列对应二分图的Y部,然后交点为连接该行和该列的一条边.匹配时每点都会把整行整列占了,因此就不会出现冲突了. 传送门:hdu1281 棋盘游戏 #include ...

  9. HDU2819(KB10-E 二分图最大匹配)

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

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

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

随机推荐

  1. 超全面的JavaWeb笔记day23<AJAX>

    AJAX AJAX概述 1 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言 ...

  2. Android中文API

    Android中文API http://www.android-doc.com/index.html

  3. java -jar Test.jar找不到main class问题

    如果你写了一些class,编 译到一个jar里面,但是在执行这个jar的时候报错,找不到main class,但是你明明是有的,是不是很郁闷,检查一下你的jar吧. 解压你的jar,打开META-IN ...

  4. CentOs 设置静态IP 方法[测试没问题]

    首先关闭VMware的DHCP: Edit->Virtual Network Editor 选择VMnet8,去掉Use local DHCP service to distribute IP ...

  5. discuz 文档说明

    Discuz  文档说明 基于7.0的标准程序,部分与插件无关的文件不作说明 文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几乎不会用到的文件,大概了解功能就可以了, ...

  6. cocos2dx游戏--欢欢英雄传说--添加人物

    接下来需要导入精灵帧资源,因为之前下载了TexturePacker,然后通过TexturePacker的"Publish sprite sheet"方法可以生成一个.pvr.ccz ...

  7. Apktool源码解析——第二篇

    上一篇讲到ApkDecoder这个类,大部分调用到还是Androlib类,而且上次发现brutall的代码竟然不是最新的,遂去找iBotP.的代码了. 今天来看Androlib的代码: private ...

  8. 在fedora 18中将普通用户设置为sudo权限

    将一般的用户加入sudo组is not in the sudoers file. This incident will be reported 解决方法 在一般用户下执行sudo命令提示xxx is ...

  9. synchronized同步语句块

    用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待比较长时间.在这样的情况下可以使用synchronized同步语句块来解 ...

  10. SASS环境搭建及HBuilder中sass预编译配置

    ---------------------------------Ruby环境安装-------------------------------- 至于为什么要安装ruby环境请移步:https:// ...