Swap
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 459 Accepted Submission(s): 129
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
Sample Output
Source
Recommend
gaojie
#include<stdio.h>
#include<string.h>
const int MAXN=105;
int uN,vN; //u,v数目
int g[MAXN][MAXN];//编号是0~n-1的
int linker[MAXN];
bool used[MAXN];
int a[10000],b[10000];
bool dfs(int u)
{
int v;
for(v=1;v<=vN;v++)
if(g[u][v]&&!used[v])
{
used[v]=true;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]=u;
return true;
}
}
return false;
}
int hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=1;u<=uN;u++)
{
memset(used,0,sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main()
{
int N;
int i,j,u,v;
while(scanf("%d",&N)!=EOF)
{
uN=vN=N;
for(i=1;i<=uN;i++)
for(j=1;j<=vN;j++)
scanf("%d",&g[i][j]);
int ans=hungary();
//printf("%d\n",ans);
if(ans<N){printf("-1\n");continue;}
int res=0;
for(i=1;i<=uN;i++)
{
for(j=i;j<=vN;j++)
if(linker[j]==i) break;
if(j!=i)
{
a[res]=i;b[res++]=j;
int t=linker[i];linker[i]=linker[j];linker[j]=t;
}
}
printf("%d\n",res);
for(i=0;i<res;i++)
printf("C %d %d\n",a[i],b[i]);
}
return 0;
}