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 */
相关文章推荐
- hdu 2819 Swap 二分图的最大匹配
- hdu 2819 Swap(二分图最大匹配,输出路径)
- HDU 2819 Swap(二分图最大匹配)
- HDU-2819 swap(二分图最大匹配)
- hdu2819 Swap--最大匹配数
- HDU 2819 Swap (二分图-行列匹配+输出解)
- HDOJ 2819 - Swap 二分图最大匹配..并输出方法..
- HDU 2819 Swap (最大二分匹配+输出路径)
- [HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)
- 小白算法练习 hdu swap 二分图 最大匹配
- HDU 2819 ——Swap——————【最大匹配、利用linker数组、邻接表方式】
- HDU 2819 Swap 最大匹配问题
- HDU 2819 Swap(最大匹配问题)
- hdu 2063 (二分图最大匹配)
- HDU 1498 -- 二分图的最大匹配
- hdu 2063 二分图最大匹配
- hdu_2063,二分图最大匹配的学习
- hdu 1281 棋盘游戏 二分图最大匹配
- hdu 过山车(二分图的最大匹配)
- hdu 2063(二分图最大匹配)学习笔记