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*m的01矩阵,你可以行交换或列交换,问交换多少次可以使左上到右下的对角线上元素全为1,输出每次交换的行或列
思路:1.行交换和列交换是等价的
2.1位置的行和列连边,然后求最大匹配,如果匹配数等于n则说明存在解
然后两个循环找一下每次交换路径就好了
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 1200
#include<vector>
int cap[maxn],line[maxn],head[maxn],vis[maxn],cnt;
struct Edge
{
int to,next;
} edge[maxn*maxn];
int n,m;
struct node
{
int x,y;
}a[maxn*maxn];
void addedge(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void init()
{
memset(line,-1,sizeof(line));
memset(head,-1,sizeof(head));
memset(cap,0,sizeof(cap));
cnt=0;
}
int dfs(int u)
{
for(int i=head[u]; i!=-1; i=edge[i].next)
{
int v=edge[i].to;
if(vis[v]==0)
{
vis[v]=1;
if(line[v]==-1||dfs(line[v])==1)
{
line[v]=u;
cap[v]=u;
return 1;
}
}
}
return 0;
}
int slove()
{
int ans=0;
for(int i=1; i<=n; i++)
{
memset(vis,0,sizeof(vis));
ans+=dfs(i);
}
return ans;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=1; i<=n; i++)
{
for(int j=1;j<=n; j++)
{
int x;
scanf("%d",&x);
if(x==1)
addedge(i,j);
}
}
int ans=slove();
if(ans!=n)
{
printf("-1\n");
continue;
}
int s=0;
for(int i=1;i<=n;i++)
{
if(cap[i]==i) continue;
for(int j=1;j<=n;j++)
{
if(cap[j]==i)
{
++s;
a[s].x=i;a[s].y=j;
swap(cap[i],cap[j]);
}
}
}
printf("%d\n",s);
for(int i=1;i<=s;i++)
{
printf("C %d %d\n",a[i].x,a[i].y);
}
}
}