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?
If it is impossible to make all the diagonal entries equal to 1, output only one one containing “-1”.
2 0 1 1 0 2 1 0 1 0
1 R 1 2 -1
题意很好理解 让我们把矩形i=j的位置变成1 可以输出步骤 不可以输出-1
通过匈牙利算法 我们可以得到数组 p[i] 他代表着我们的1是从哪里来的,我们可以只进行R操作就能得到想要的矩阵
8
0 0 0 1 0 1 1 1
1 1 1 0 0 0 1 1
0 0 0 0 1 0 1 0
0 0 1 1 0 1 0 1
0 1 1 1 1 0 0 1
1 0 1 1 1 0 1 1
0 1 0 1 1 1 1 1
1 0 1 1 1 0 0 1
p[i]数组 为 8 2 5 7 6 1 3 4
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[110][110];
int p[110];
int v[110];
int vv[110];
struct node
{
int x,y;
}bb[555];
int pp;
int dfs(int u)
{
for(int i=1;i<=n;i++)
{
if(!v[i]&&a[u][i])
{
v[i]=1;
if(!p[i]||dfs(p[i]))
{
p[i]=u;
return 1;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n))
{
memset(p,0,sizeof(p));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
int sum=0;
pp=0;
for(int i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
if(dfs(i)) sum++;
}
if(sum!=n)
printf("-1\n");
else
{
int ans=0;
for(int i=1;i<=n;i++)
{
v[i]=i;
vv[i]=p[i];
}
for(int i=1;i<=n;i++)
{
if(p[i]!=v[i])
{
swap(v[i],v[vv[i]]);
bb[ans].x=i;
bb[ans++].y=vv[i];
for(int j=i+1;j<=n;j++)
{
if(vv[j]==i)
{
swap(vv[j],vv[i]);
break;
}
}
}
}
printf("%d\n",ans);
for(int i=0;i<ans;i++)
printf("R %d %d\n",bb[i].x,bb[i].y);
}
}
}