hdu-2819.swap(二分匹配 + 矩阵的秩基本定理)
Swap
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5728 Accepted Submission(s): 2157
Special Judge
If it is impossible to make all the diagonal entries equal to 1, output only one one containing “-1”.
0 1
1 0
2
1 0
1 0
R 1 2
-1
这个题一开始没有想到是二分匹配,主要是不知道这个定理.
矩阵的秩:
一般矩阵经过初等变换之后得到的阶梯矩阵中,不全为0的行数为行秩,不全为0的列的个数为列秩,一个矩阵的行秩等于列秩等于矩阵的秩.
矩阵的秩的一般定理:
初等变换不能改变矩阵的秩.
/*************************************************************************
> File Name: hdu-2819.swap.cpp
> Author: CruelKing
> Mail: 2016586625@qq.com
> Created Time: 2019年09月02日 星期一 17时56分18秒
本题大意:给定一个n × n 的0 or 1矩阵,问你若只交换某些行和列(行之间进行交换,列之间进行交换)能否使得最后的矩阵在从左上角到右下角的对角线上元素都为1.
本题思路:线性代数里我们学过初等变换不会改变矩阵的秩,因此如果一个矩阵满秩,那么必定有解,如何判断矩阵是否满秩呢?因为是0 or 1矩阵,因此,原矩阵经过变换后得到的阶梯矩阵也都只有0 or 1,如果其中某两列的元素完全相等,或者某一列中本来就不存在1那么转换之后的阶梯矩阵自然也就不会满秩。所以我们可以对行和列缩点,判断是否每一列都有独特的一行与之对应,如果说有两列的1都存在与同一行,那么必定无法匹配,所以我们就想到了二分匹配,让行缩点为x,列缩点为y,匹配之后,如果最大匹配为n那么匹配成功,否则说明矩阵非满秩,如何输出解呢?我们遍历所有列,如果发现有一列与他匹配的行不与他的标号相等,则说明这个(i, j)位于第i行第j列,那么我们把第j列换到第i列即可.也就是交换j与linker[j],交换了之后肯定要改变其匹配状态,也就是让匹配i的行和匹配j的行再互换。
************************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + , maxm = + , inf = 0x3f3f3f3f; typedef pair<int, int> pii;
int n, linker[maxn], g[maxn][maxn];
bool used[maxn];
pii path[maxm];
int tot; bool dfs(int u) {
for(int v = ; v <= n; v ++) {
if(!used[v] && g[u][v]) {
used[v] = true;
if(linker[v] == - || dfs(linker[v])) {
linker[v] = u;
return true;
}
}
}
return false;
} int main() {
while(~scanf("%d", &n)) {
tot = ;
for(int i = ; i <= n; i ++) {
for(int j = ; j <= n; j ++) {
scanf("%d", &g[i][j]);
}
}
memset(linker, -, sizeof linker);
int res = ;
for(int i = ; i <= n; i ++) {
memset(used, false, sizeof used);
if(dfs(i)) res ++;
}
if(res != n) printf("%d\n", -);
else {
for(int i = ; i <= n; i ++) {
while(i != linker[i]) {
path[tot ++] = make_pair(i, linker[i]);
swap(linker[i], linker[linker[i]]);
}
}
printf("%d\n", tot);
for(int i = ; i < tot; i ++) {
printf("C %d %d\n", path[i].first, path[i].second);
}
}
}
return ;
}
hdu-2819.swap(二分匹配 + 矩阵的秩基本定理)的更多相关文章
- HDU 2819 Swap (二分匹配+破输出)
题意:给定上一个01矩阵,让你变成一个对角全是 1 的矩阵. 析:二分匹配,把行和列看成两个集合,用匈牙利算法就可以解决,主要是在输出解,在比赛时一紧张不知道怎么输出了. 输出应该是要把 match[ ...
- HDU 2819 — Swap 二分匹配
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU - 2819 Swap (二分图匹配-匈牙利算法)
题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...
- HDU 2819 Swap (行列匹配+输出解)
题意:是否能使对角线上全是1 ,这个简单直接按行列匹配.难在路径的输出,我们知道X,Y左右匹配完了之后,不一定是1–1,2–2,3–3--这种匹配.可能是1–3,2–1,3–2,我们要把他们交换成前一 ...
- hdu 2819 Swap
Swap http://acm.hdu.edu.cn/showproblem.php?pid=2819 Special Judge Problem Description Given an N*N m ...
- HDU 2819 ——Swap——————【最大匹配、利用linker数组、邻接表方式】
Swap Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu 1281棋盘游戏(二分匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘, ...
- HDU 3468 BFS+二分匹配
九野的博客,转载请注明出处 http://blog.csdn.net/acmmmm/article/details/10966383 开始建图打搓了,参考了大牛的题解打的版本比较清爽,后来改的基本雷同 ...
- HDU - 2819 Swap(二分匹配)
题意:交换任意两行或两列,使主对角线全为1. 分析: 1.主对角线都为1,可知最终,第一行与第一列匹配,第二行与第二列匹配,……. 2.根据初始给定的矩阵,若Aij = 1,则说明第i行与第j列匹配, ...
随机推荐
- LeetCode--015--三数之和(python)
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 先对nums进行排序,再用双指针,L ...
- Node.js 版本管理工具——nvm
日常项目开发中,有些项目可能基于node V10 或者 V8 不同的版本: 如果我们手动安装卸载node,这样是不友好. 先放上作者的博客地址 : https://www.cnblogs.com/g ...
- UML规则笔记
一.类 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务 ...
- spring boot不要放在tomcat下启动,因为自身就带了集成tomcat
spring boot不要放在tomcat下启动,因为自身就带了集成tomcat
- 【JOI2017春季合宿】Port Facility
http://uoj.ac/problem/356 题解 思路和\(NOIP\)双栈排序差不多. 对于两个元素,若\(l_1<l_2<r_1<r_2\)那么它们不能在一个栈里,我们连 ...
- [CSP-S模拟测试]:辣鸡(ljh) (暴力)
题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了.然而在上化学课的时候,数学和化学都不好的$ljh$却被一道简单题难住了,受到了大佬的嘲笑.题目描述是这样的:在一个二维平面上有一层 ...
- 手把手教你做echarts图表系列之组织结构图
在实际项目中使用echarts越来越多了,今天从一个组织结构图开始,手把手教大家开发echarts图表. 公司里的组织结构图如下: 可以参考echarts入门教程:http://echarts.bai ...
- 深入JavaWeb技术世界15:深入浅出Mybatis基本原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- yum命令查询详解
一.列举包文件列出资源库中所有可以安装或更新的rpm包# yum list列出资源库中特定的可以安装或更新以及已经安装的rpm包# yum list perl //列出名为perl ...
- a special kind of crossword called a word square
w Language Log: Wordplay Watch #2: The hunt for the ten-square http://itre.cis.upenn.edu/~myl/langu ...