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

2
0 1
1 0
2
1 0
1 0

Sample Output

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

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

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

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct sss
{
int x,y;
}a[];
int n;
int mp[][];
int vis[];
int girl[];
int dfs(int x)
{
for(int i=;i<=n;i++)
{
if(mp[x][i]&&vis[i]==)
{
vis[i]=;
if(girl[i]==||dfs(girl[i]))
{
girl[i]=x;
return ;
}
}
}
return ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(girl,,sizeof(girl));
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
scanf("%d",&mp[i][j]);
}
int sum=;
for(int i=;i<=n;i++)
{
memset(vis,,sizeof(vis));
sum+=dfs(i);
}
if(sum!=n) printf("-1\n");//看是否满足全部匹配到了
else{
int num=;
for(int i=;i<=n;i++)
{
if(i!=girl[i])//灵活利用girl数组记录了匹配的行
{
for(int j=i+;j<=n;j++)//如果当前行匹配出错,找出需要匹配的行在哪里
{
if(i==girl[j])
{
int t;
t=girl[i];
girl[i]=girl[j];
girl[j]=t;
a[num].x=i;
a[num].y=j;
num++;
break;
}
}
}
}
printf("%d\n",num);
for(int i=;i<num;i++)
{
printf("C %d %d\n",a[i].x,a[i].y);
}
}
}
}
												

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. LeetCode--326--3的幂

    问题描述: 给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示 ...

  2. Web3.js 0.20.x API 中文版翻译

    文档原始链接为:https://web3.learnblockchain.cn/0.2x.x/,欢迎大家前往查阅,本文只是节选开头部分的介绍及API列表索引,以下为翻译正文: 为了开发一个基于以太坊的 ...

  3. js新打开页面

    var a = document.createElement("a"); a.setAttribute("href", href); a.setAttribut ...

  4. Permutations CodeForces - 736D (矩阵逆)

    对于删除每个对(x,y), 可以发现他对答案的贡献为代数余子式$A_{xy}$ 复习了一下线代后发现代数余子式可以通过伴随矩阵求出, 即$A_{xy}=A^*[y][x]$, 伴随矩阵$A^*=|A| ...

  5. strom:实时的WordCount

    集采单词 package wordcount; import java.io.File; import java.io.IOException; import java.util.Collection ...

  6. 小程序setData修改数组某一项的值

    官方文档是这样的: changeItemInArray: function() { // you can use this way to modify a danamic data path this ...

  7. 解决gitHub下载速度慢的问题

    转载:http://blog.csdn.net/x_studying/article/details/72588324 github被某个CDN被伟大的墙屏蔽所致. 解决方法: 1.访问http:// ...

  8. Beta阶段——第3篇 Scrum 冲刺博客

    Beta阶段--第3篇 Scrum 冲刺博客 标签:软件工程 一.站立式会议照片 二.每个人的工作 (有work item 的ID) 昨日已完成的工作 人员 工作 林羽晴 完成了报表数据的接口函数 顾 ...

  9. MySQL_插入更新 ON DUPLICATE KEY UPDATE

    平时我们在设计数据库表的时候总会设计 unique  或者 给表加上 primary key 的限制条件. 此时 插入数据的时候 ,经常会有这样的情况: 我们想向数据库插入一条记录: 若数据表中存在以 ...

  10. vue组件通信&&v兄弟组件通信eventbus遇到的问题(多次触发、第一次不触发)

    组件通讯包括:父子组件间的通信和兄弟组件间的通信.在组件化系统构建中,组件间通信必不可少的 (vuex以后再说). 父组件--> 子组件 1. 属性设置 父组件关键代码如下: <templ ...