您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: