HDU 2819 Swap
来源:互联网 发布:何炅主持网络综艺节目 编辑:程序博客网 时间:2024/05/21 17:14
大神博客
需要注意的,在大神博客中都有注明
但是有一点是关于如何输出交换的过程
我刚开始些写的是如果改点的match值不等于自身,那么说明该点交换过了
但是忘了,可能该点经过了多次交换
那么要还原原过程就要倒着来
如果改点match值不等于本身,然后交换值, 交换两个match值
模拟交换的过程来倒着交换
直至所有的点match值都等于本身
#include<bits/stdc++.h>using namespace std;const int maxn=110;int e[maxn][maxn];int vis[maxn];int match[maxn];bool visnum[maxn];int n;void chang(int &a,int &b){ if(a>b) swap(a,b);}bool find(int u){ for(int i=1; i<=n; i++) { if(vis[i]==0&&e[u][i]) { vis[i]=1; if(!match[i]||find(match[i])) { match[i]=u; return true; } } } return false;}int main(){ while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%d",&e[i][j]); } } int ans=0,flag=1; memset(match,0,sizeof(match)); memset(visnum,0,sizeof(visnum)); for(int i=1; i<=n; i++) { memset(vis,0,sizeof(vis)); if(find(i)) ans++; else flag=0; } if(!flag) { printf("-1\n"); continue; } int cnt=0; for(int i=1;i<=n;i++) { if(match[i]!=i) cnt++; } printf("%d\n",cnt/2); for(int i=1; i<=n; i++) { if(match[i]!=i) { chang(i,match[i]); if(!visnum[i]) printf("R %d %d\n",i,match[i]); visnum[i]=visnum[match[i]]=true; } } }}
阅读全文
0 0
- hdu 2819 Swap
- hdu 2819 swap
- hdu 2819 Swap
- hdu 2819 Swap
- hdu 2819 Swap
- HDU 2819 Swap
- hdu 2819 Swap
- HDU 2819 Swap 二分匹配
- Swap HDU
- Swap HDU
- HDU 2819 Swap(最大匹配问题)
- hdu 2819 Swap 二分图匹配
- hdu-2819 Swap 二分图匹配
- HDU 2819 Swap(二分图匹配)
- Swap - HDU 2819 二分图匹配
- hdu 2819 Swap(二分图匹配)
- hdu-2819 Swap (二分匹配)
- hdu 2819 Swap (二分图匹配)
- eclipse全屏豆沙绿设置步骤
- 大数据组件服务的启动与关闭命令
- 接口和多态
- git使用命令小结
- 异常
- HDU 2819 Swap
- Tomcat下目录的结构;动态WEB资源目录结构
- 算法_00_KMP
- JavaScript的遍历
- 调用服务的几种方式
- C\C++语言指针的强大用法之减少内存申请次数
- 多线程
- 你不一定看得懂的朴素贝叶斯算法原理
- Android AccountManager帐号管理(一)