您的位置:首页 > 其它

hdu 2819(二分匹配)

2013-06-03 09:51 489 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819

思路:有矛盾关系的可以考虑二分匹配= =只交换行或者只交换列都能得到目的,如果不能,就输出-1。建图的时候应该建有向图。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>[
using namespace std;
#define MAXN 111
int n,x;
int map[MAXN][MAXN];
bool mark[MAXN];
int row[MAXN];
int ly[MAXN];

bool dfs(int u){
for(int i=1;i<=n;i++){
if(map[u][i]&&!mark[i]){
mark[i]=true;
if(ly[i]==-1||dfs(ly[i])){
ly[i]=u;
return true;
}
}
}
return false;
}

bool MaxMatch(){
memset(ly,-1,sizeof(ly));
for(int i=1;i<=n;i++){
memset(mark,false,sizeof(mark));
if(!dfs(i))return false;
}
return true;
}

int main(){
//   freopen("1.txt","r",stdin);
while(~scanf("%d",&n)){
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&x);
map[j][i]=x;
}
}
if(!MaxMatch()){ puts("-1");continue; }
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(ly[j]==i){ row[i]=j;swap(ly[j],ly[i]);break; }
}
}
printf("%d\n",n);
for(int i=1;i<=n;i++)
printf("R %d %d\n",i,row[i]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: