Swap——hdu 2819
2015-08-18 20:58
183 查看
Swap
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2152 Accepted Submission(s): 764
Special Judge
[align=left]Problem Description[/align]
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?
[align=left]Input[/align]
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.
[align=left]Output[/align]
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”.
[align=left]Sample Input[/align]
2
0 1
1 0
2
1 0
1 0
[align=left]Sample Output[/align]
1
R 1 2
-1
[align=left]Source[/align]
2009 Multi-University Training Contest 1 - Host by TJU
题意:如果可以交换行列,问主对角线能不能全为1
分析:要想主对角线全为1很明显要有N个行列不想同的点就行了,可以用二分图匹配计算出来多能有几个。如果小与N就不能。输出要是对的就行,不必和答案一样
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define N 1100 int n, vis , used , a , b ; int maps ; int found(int u) { for(int i = 1; i <= n; i++) { if(!vis[i] && maps[u][i]) { vis[i] = 1; if(!used[i] || found(used[i])) { used[i] = u; return true; } } } return false; } int main() { int w; while(scanf("%d", &n) != EOF) { memset(vis, 0, sizeof(vis)); memset(used, 0, sizeof(used)); memset(maps, 0, sizeof(used)); memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); int ans = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) scanf("%d", &maps[i][j]); for(int i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); if(found(i)) ans++; } if(ans < n) { printf("-1\n"); continue; } w = 0; for(int i = 1; i <= n; i++) { while(used[i] != i) { a[w] = i; b[w] = used[i]; swap(used[a[w]], used[b[w]]); // 如果该行匹配不是自身,就交换匹配。 w++; } } printf("%d\n", w); for(int i = 0; i < w; i++) printf("C %d %d\n", a[i], b[i]); } return 0; }
相关文章推荐
- 二进制文件与文本文件有哪些差异
- 【动态树】 HDOJ 5398 GCD Tree
- RelativeLayout
- Mem Cgroup目录无法清理问题分析
- C#在WinForm中重写ProgressBar控件(带%的显示)
- HDOJ2544(简单最短路)
- Hdu 2015 Multi-University Training Contest9
- [150105]【同人CG集】agical Knights Situation Collection vol.6 ~魔法戦士+α 悪堕ちヒロインコレクション~,爆乳しるふぃーど (2CG)
- 【LeetCode】2_Add Two Numbers
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(8月10日~8月16日)
- 服务器分布式锁
- 1
- required string parameter XXX is not present
- IOS学习之OC内存管理
- Spring 入门教程(三) 注入和自动装配
- 运行时改变控件的大小(点击后立刻ReleaseCapture,然后计算位移,最后发消息改变位置)——最有趣的是TPanel其实也有窗口标题,因此可发HTCAPTION消息
- required string parameter XXX is not present
- required string parameter XXX is not present
- 2015 Multi-University Training Contest 9 hdu 5396 Expression
- Android中shell命令语句