HDU 2819 Swap 二分图最大匹配

来源:互联网 发布:java执行sql语句的返回 编辑:程序博客网 时间:2024/05/17 01:17
#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;}/*30 1 01 0 00 0 1*/

0 0
原创粉丝点击