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;
}
题意是从左上角到右下角的对角线上的点都要通过整行或整列的移动 为 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;
}
相关文章推荐
- hdu 2819 Swap(二分图最大匹配,输出路径)
- HDU 2819 Swap (行列匹配+输出解)
- HDU 2819 Swap (行列匹配+输出解)
- HDU 2819 Swap 二分图最大匹配
- HDOJ 2819 - Swap 二分图最大匹配..并输出方法..
- HDU 2819 Swap (最大二分匹配+输出路径)
- HDU - 2819 Swap (二分匹配+输出路径)
- HDU 2819 Swap (二分匹配+破输出)
- HDU 2819 行列匹配 输出解
- HDU-2819 swap(二分图最大匹配)
- hdu 2819 Swap 二分图的最大匹配
- HDU 2819 Swap(二分图最大匹配)
- HDU-2819-Swap [二分匹配][输出路径]
- HDU 2819 ——Swap——————【最大匹配、利用linker数组、邻接表方式】
- HDU 2819 Swap(记录二分匹配的过程)
- HDOJ 题目2189 Swap(二分图最大匹配,输出路径)
- hdu 1045(dfs暴搜/缩点+二分图最大匹配(典型行列匹配题))
- HDU 2819 Swap【二分图|启发题】
- HDU 2819 Swap 二分匹配
- hdu2819 Swap 二分图最大匹配 输出路径