您的位置:首页 > 其它

HDU 2819 Swap (二分图-行列匹配+输出解)

2013-08-20 09:26 375 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2819

题意是从左上角到右下角的对角线上的点都要通过整行或整列的移动 为 1 。 只要每行每列都不全为0 , 就可以组成题目要求。

太挫了, 以为题目是求 最小的移动的次数和方案。其实是任意可行的,通过行完成的,必然可以通过列完成。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;
#define max(a,b) (a):(b)
#define INF 100000000
#define N 110
int map

;
int ans1
,ans2
;
int maty
,ty
;
int n;
int dfs(int x)
{
int i,j,k;
for(i=1;i<=n;i++)
{
if(map[x][i] && !ty[i])
{
ty[i]=1;
if(maty[i]<0 || dfs(maty[i]))
{
maty[i]=x; return 1;
}
}
}
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
int i,j,k;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
}
memset(maty,-1,sizeof(maty));
int ans=0;
for(i=1;i<=n;i++)
{
memset(ty,0,sizeof(ty));
ans+=dfs(i);
}
int out=0;
int ar=0;
if(ans!=n) printf("-1\n");
else
{
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
if(maty[j]==i) break;
if(j!=i)
{
ans1[ar]=i; ans2[ar++]=j;
int tt=maty[i];
maty[i]=maty[j];
maty[j]=tt;
}
}
printf("%d\n",ar);
for(i=0;i<ar;i++)
{
printf("C %d %d\n",ans1[i],ans2[i]);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: