题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819

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

题目翻译:

给定一个 N+N 矩阵,每个条目等于 0 或 1。您可以交换任意两行或任何两列。您能找到一种方法,使所有的对角线条目等于1?‎

‎输入‎

‎输入中有几个测试用例。每个测试用例的第一行是整数 N(1 <= N <= 100)。然后 N 行跟随,每个线包含 N 个数字 (0 或 1),按空格分隔,指示 N+N 矩阵。‎

‎输出‎

‎对于每个测试用例,第一行包含交换 M 的数量。然后,M 行跟随,其格式为"R a b"或"C a b",指示交换行 a 和行 b,或交换列 a 和列 b.(1 <= a,b <= N)。任何正确答案都将被接受,但 M 应大于 1000。‎
‎如果不可能使所有对角线条目等于 1,则只输出一个包含"-1"的‎条目.

比较经典的二分图的题,其实不难看出X点集就是点的x坐标,Y点集就是y坐标。然后求出二分图的最大匹配,如果最大匹配数不等于N,则表示不能。否则对最大匹配后的二分图‎中的每个X点集中的进行遍历,如果X点集和Y点集的编号相同,表示不用交换。如果不相同,那么遍历后面的X点集,把满足条件的X点集与当前点集进行交换,并记录下来。

附:其实我们可以发现这样一个规律,如果能够通过交换得到符合条件的矩阵,那么就一定能通过行交换得到。

#include <bits/stdc++.h>
using namespace std;
int nxt[10005],visited[105],G[105][105];
int n;
int L[10005],R[10005];
int find(int u){for(int v = 1;v<=n;++v){if(!visited[v]&&G[u][v]){visited[v]=1;if(nxt[v]==-1||find(nxt[v])){nxt[v]=u;return 1;}}}return 0;
}
int match()
{int ans=0;memset(nxt,-1,sizeof(nxt));for(int i = 1;i<=n;++i){memset(visited,0,sizeof(visited));if(find(i))ans++;}return ans;
}
int main(int argc, char** argv) {while(cin>>n){memset(G,0,sizeof(G));for(int i = 1;i<=n;++i){for(int j = 1;j<=n;++j){cin>>G[i][j];}}int num=match();if(num!=n){cout<<"-1"<<endl;continue;}int cnt=0;for(int i = 1;i<=n;++i){if(i!=nxt[i]){for(int j=i+1;j<=n;j++){if(i==nxt[j]){L[cnt]=i;R[cnt++]=j;swap(nxt[i],nxt[j]);break;}}}} cout<<cnt<<endl;for(int i = 0;i<cnt;i++) cout<<'C'<<' '<<L[i]<<' '<<R[i]<<endl;}return 0;
}

有关二分图匹配的资料和知识可以参考我的这篇文章:https://blog.csdn.net/qq_43472263/article/details/96831025

Swap——二分图最大匹配相关推荐

  1. HDU - 2819 Swap(二分图完备匹配+路径输出)

    题目链接:点击查看 题目大意:给出一个n*n的01矩阵,问能否通过数次交换行和列,使得主对角线上的值全部为1 题目分析:因为对角线上的每个元素都对应着不同的一行和一列,换句话说,如果有解,那么肯定可以 ...

  2. 【网络流】【二分图最大匹配】Buaacoding1043 难题·Beihang Couple Pairing Comunity 2017

    难题·Beihang Couple Pairing Comunity 2017 时间限制: 2000 ms 内存限制: 131072 kb 总通过人数: 10 总提交人数: 15 题目描述 BCPC( ...

  3. 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)

    A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...

  4. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  5. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  6. 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...

  7. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  8. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

  9. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

最新文章

  1. Python学习day12(生成器,列表/生成器推导式)
  2. mysql gtid寻找位置_【MySQL】UUID与GTID以及如何根据GTID找寻filename和position
  3. python pip install syntaxerror_解决pip install xxx报错SyntaxError: invalid syntax的问题
  4. 伽利略板子串口驱动安装问题
  5. 使用pm2后台运行nodejs程序
  6. 东南大学成贤学院计算机报名,2019上半年东南大学成贤学院全国计算机等级考试预报名通知...
  7. android color属性黑色,android – 未找到样式属性attr / colorSecondary
  8. Lwip协议详解(基于Lwip 2.1.0)TCP协议 (未完待续)
  9. mysqlFront连接报错,打开数据库#3167的解决方案
  10. ros之tf简介[tf-Package Summary]
  11. Robomaster哨兵视觉算法以及线程和通信设计【2021】
  12. 戴尔电脑重装系统的blos设置
  13. npm 包管理器_纱包管理器:npm的改进
  14. centos tcpdump
  15. ODR, BSRR, BRR的差别
  16. 知道一点怎么设直线方程_如何快速求一个点有关一条直线的对称点的坐标?
  17. Cauchy–Schwarz inequality理解
  18. 电子设备的电磁兼容性EMC测试项
  19. python的搜题软件下载_用Python模拟搜索引擎蜘蛛
  20. 酶联免疫吸附试验(ELISA)的必备仪器

热门文章

  1. 我的世界java村民繁殖_教程/村民养殖 - Minecraft Wiki,最详细的官方我的世界百科...
  2. Spring Cloud 2.2.2 源码之二十九nacos客户端获取配置原理四
  3. 吃字母------线程同步与互斥的学习
  4. C# NPOI 和 CSV 导出Excel 功能实现
  5. USACO 2018 February Contest, Silver-Rest Stops
  6. 软件测试(敏捷开发、迭代模型)
  7. 计算两个数据的百分比
  8. 区分线性系统和非线性系统
  9. phpmywind目录结构
  10. gtx1650显卡什么级别! GTX1650相当于什么显卡