您的位置:首页 > 其它

HDU 2819 Swap 二分图最大匹配

2016-08-02 21:24 513 查看
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxm=110;
int map[maxm][maxm],vis[maxm],flag[maxm],r[maxm],n,a[maxm],b[maxm];
int find(int k);
int main()
{
int i,j,k,sum;
while(scanf("%d",&n)!=EOF)
{
memset(map,0,sizeof(map));
memset(flag,0,sizeof(flag));
memset(r,0,sizeof(r));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&k);
if(k==1)
map[i][j]=1;

}
}
sum=0;
for(i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
sum+=1;
}
//printf("dh\n");
if(sum<n)
{
printf("-1\n");
continue;
}
int ans=0,temp;
for(i=1;i<=n;i++)
{
//printf("%d\n",flag[i]);
for(j=1;j<=n;j++)
{
if(flag[j]==i)
break;
}
//printf("fj\n");
if(i!=j)
{
ans++;
a[ans]=i;b[ans]=j;
temp=flag[i];flag[i]=flag[j];flag[j]=temp;

}

}
printf("%d\n",ans);
for(i=1;i<=ans;i++)
printf("C %d %d\n",a[i],b[i]);
}
return 0;
}
int find(int k)
{
int i,j;
for(j=1;j<=n;j++)
{
if(!vis[j] && map[k][j])
{
vis[j]=1;
if(!flag[j] || find(flag[j]))
{
flag[j]=k;
return 1;
}
}
}
return 0;
}
/*
3
0 1 0
1 0 0
0 0 1
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: