需要注意的,在大神博客中都有注明
但是有一点是关于如何输出交换的过程
我刚开始些写的是如果改点的match值不等于自身,那么说明该点交换过了
但是忘了,可能该点经过了多次交换
那么要还原原过程就要倒着来
如果改点match值不等于本身,然后交换值, 交换两个match值
模拟交换的过程来倒着交换
直至所有的点match值都等于本身
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
int e[maxn][maxn];
int vis[maxn];
int match[maxn];
bool visnum[maxn];
int n;
void chang(int &a,int &b)
{
if(a>b)
swap(a,b);
}
bool find(int u)
{
for(int i=1; i<=n; i++)
{
if(vis[i]==0&&e[u][i])
{
vis[i]=1;
if(!match[i]||find(match[i]))
{
match[i]=u;
return true;
}
}
}
return false;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%d",&e[i][j]);
}
}
int ans=0,flag=1;
memset(match,0,sizeof(match));
memset(visnum,0,sizeof(visnum));
for(int i=1; i<=n; i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
ans++;
else
flag=0;
}
if(!flag)
{
printf("-1\n");
continue;
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(match[i]!=i)
cnt++;
}
printf("%d\n",cnt/2);
for(int i=1; i<=n; i++)
{
if(match[i]!=i)
{
chang(i,match[i]);
if(!visnum[i])
printf("R %d %d\n",i,match[i]);
visnum[i]=visnum[match[i]]=true;
}
}
}
}