//hdu 2819
//直接按照给定的矩阵建图
//判断匹配是否能达到n
//然后选择排序确定交换顺序。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace::std;
const int INF=0x7fffffff;
const int N=110;
int g[N][N];
int L[N],R[N];
struct Hungary{
int used[N],line[N];
void init(){
memset(line,-1,sizeof(line));
}
bool find(int u,int n){
for(int i=0;i<n;i++){
if(g[u][i]&&!used[i]){
used[i]=true;
if(line[i]==-1||find(line[i],n)){
line[i]=u;
return 1;
}
}
}
return 0;
}
int Max_match(int n){
int all=0;
for(int i=0;i<n;i++){
memset(used,0,sizeof(used));
if(find(i,n))all+=1;
}
return all;
}
};
Hungary huy;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&g[i][j]);
}
}
huy.init();
int ans=huy.Max_match(n);
if(ans<n){
printf("-1\n");
}
else{
int cnt=0;
for(int i=0;i<n;i++){//选择排序
for(int j=0;j<n&&huy.line[i]!=i;j++){
if(huy.line[j]==i){
L[++cnt]=i;R[cnt]=j;
swap(huy.line[i],huy.line[j]);
break;
}
}
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
printf("C %d %d\n",L[i]+1,R[i]+1);
}
}
return 0;
}
hdu 2819 Swap 二分图的最大匹配
最新推荐文章于 2020-04-08 10:43:31 发布