Swap[HDU2819]
Swap
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3102 Accepted Submission(s): 1117
Special Judge
Problem Description
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的01矩阵,要求通过若干次行交换或列交换来满足主对角线上的数字均为1。
首先能确定的一点,只用行交换或只用列交换就能满足。一开始看到跟覆盖有关,还在想会不会是舞蹈链什么的,后来发现并不需要。可以把对角线上某一点为1理解为行与列的匹配,这样行和列就正好构成了一个二分图。如果这个二分图的最大匹配为n的话就存在方案,此时,根据匈牙利算法的匹配数组就能找到解法。
#include <stdio.h>
#include <string.h> int a[], b[];
class Hungary {
#define Hungary_MAX_Node 105
#define Hungary_MAX_Edge 10005
public:
struct EDGE {
int v;
int next;
} edge[Hungary_MAX_Edge];
int head[Hungary_MAX_Node];
int Left[Hungary_MAX_Node];
bool vis[Hungary_MAX_Node];
int N, M;
Hungary() {
clear();
}
void clear() {
N = M = ;
memset(Left, , sizeof(Left));
memset(head, -, sizeof(head));
}
void addEdge(int a, int b) {
edge[M].v = b;
edge[M].next = head[a];
head[a] = M++;
}
bool dfs(int u) {
for (int e = head[u]; e != -; e = edge[e].next) {
int v = edge[e].v;
if (!vis[v]) {
vis[v] = true;
if (!Left[v] || dfs(Left[v])) {
Left[v] = u;
return true;
}
}
}
return false;
}
int Max_Match() {
int ret = ;
for (int i = ; i <= N; i++) {
memset(vis, , sizeof(vis));
if (dfs(i)) {
ret++;
}
}
return ret;
}
};
Hungary hungary;
int main() {
int N;
while (~scanf("%d", &N)) {
hungary.clear();
hungary.N = N;
int x, ans;
for (int i = ; i <= N; i++)
for (int j = ; j <= N; j++) {
scanf("%d", &x);
if (x) {
hungary.addEdge(i, j);
}
}
ans = hungary.Max_Match();
if (ans < N) {
printf("-1\n");
continue;
}
int tot = , j;
for (int i = ; i <= N; i++) {
for (j = ; j <= N && hungary.Left[j] != i; j++);
if (i != j) {
a[tot] = i;
b[tot] = j;
tot++;
int t = hungary.Left[i];
hungary.Left[i] = hungary.Left[j];
hungary.Left[j] = t;
}
}
printf("%d\n", tot);
for (int i = ; i < tot; i++) {
printf("C %d %d\n", a[i], b[i]);
}
}
return ;
}
Swap[HDU2819]的更多相关文章
- HDU2819 Swap —— 二分图最大匹配
题目链接:https://vjudge.net/problem/HDU-2819 Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- hdu-2819.swap(二分匹配 + 矩阵的秩基本定理)
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Hdu2819 Swap
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU2819:Swap(二分图匹配)
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu2819 Swap 最大匹配(难题)
题目大意: 给定一个元素的值只有1或者0的矩阵,每次可以交换两行(列),问有没有方案使得对角线上的值都是1.题目没有限制需要交换多少次,也没限制行交换或者列交换,也没限制是主对角线还是副对角线.虽然没 ...
- hdu1281+hdu2819(最大匹配数)
分析:将行和列缩点,即行对应二分图的X部,列对应二分图的Y部,然后交点为连接该行和该列的一条边.匹配时每点都会把整行整列占了,因此就不会出现冲突了. 传送门:hdu1281 棋盘游戏 #include ...
- HDU 2819 - Swap - [二分图建模+最大匹配]
题目链接:https://cn.vjudge.net/problem/HDU-2819 Given an N*N matrix with each entry equal to 0 or 1. You ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- LVM 管理减少swap分区空间增加到根分区
简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现 ...
随机推荐
- 添加Pods后,import无提示的解决办法
选择工程的 Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项 新增一个值"$(PODS_ROOT)" ...
- [转]PHP echo, print, printf, sprintf函数的区别和使用
1. echo函数: 输出函数,是命令,不能返回值.echo后面可以跟很多个参数,之间用分号隔开,如: echo $myvar1; echo 1,2,$myvar,"<b>bol ...
- [转]mysql 导入导出数据库以及函数、存储过程的介绍
本篇文章是对mysql中的导入导出数据库命令以及函数.存储过程进行了详细的分析介绍,需要的朋友参考下: mysql常用导出数据命令:1.mysql导出整个数据库 mysqldump -hhostna ...
- 【模板】【网络流】Dinic
/* 唐代杜荀鹤 <小松> 自小刺头深草里,而今渐觉出蓬蒿. 时人不识凌云木,直待凌云始道高. */ #include <iostream> #include <cstd ...
- js 实现tab选项卡
最近一直在研究js 如果不及时复习的话前边学到的东西很快就会忘掉,所以把前段时间的一个简单的tab选项卡的思路写出来也算复习了一下吧, 第一步:先把布局写出来: <div id="d ...
- PHP图片操作
<?php $filename="http://pic.nipic.com/2007-12-06/2007126102233577_2.jpg";//图片地址//获取图片信息 ...
- Day14 HTML补充
一.认识前端 前端开发的核心语言: html - 超文本标记语言 结构 css - 层叠样式表 样式 javascript - 脚本语言 行为 <html></html> 双标 ...
- 写个自己的Xcode4插件
推荐:http://onevcat.com/2013/02/xcode-plugin/ 刚写iOS程序的时候就知道Xcode支持第三方插件,比如ColorSense等很实用的插件,但Xcode的插 ...
- 大神眼中的React Native--备用
当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...
- InfiniBand技术简介
InfiniBand技术简介 转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 随着CPU和通讯处理速度的 ...