[HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2819
题意:给一张n*n的01矩阵,可以任意交换其中的行或者列,问是否可以交换出来一个对角线上都是1的矩阵。
按行列号建图,如果(i,j)为1的话,则i和j就有一条边。匹配出的结果可以认为如何交换使得行列相等,输出结果要注意不要忘记更新linker,以保证在正确的位置。
1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗┛┗┛┃ 13 ┓┏┓┏┓┃ 14 ┃┃┃┃┃┃ 15 ┻┻┻┻┻┻ 16 */ 17 #include <algorithm> 18 #include <iostream> 19 #include <iomanip> 20 #include <cstring> 21 #include <climits> 22 #include <complex> 23 #include <fstream> 24 #include <cassert> 25 #include <cstdio> 26 #include <bitset> 27 #include <vector> 28 #include <deque> 29 #include <queue> 30 #include <stack> 31 #include <ctime> 32 #include <set> 33 #include <map> 34 #include <cmath> 35 using namespace std; 36 #define fr first 37 #define sc second 38 #define cl clear 39 #define BUG puts("here!!!") 40 #define W(a) while(a--) 41 #define pb(a) push_back(a) 42 #define Rint(a) scanf("%d", &a) 43 #define Rll(a) scanf("%I64d", &a) 44 #define Rs(a) scanf("%s", a) 45 #define Cin(a) cin >> a 46 #define FRead() freopen("in", "r", stdin) 47 #define FWrite() freopen("out", "w", stdout) 48 #define Rep(i, len) for(int i = 0; i < (len); i++) 49 #define For(i, a, len) for(int i = (a); i < (len); i++) 50 #define Cls(a) memset((a), 0, sizeof(a)) 51 #define Clr(a, x) memset((a), (x), sizeof(a)) 52 #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) 53 #define lrt rt << 1 54 #define rrt rt << 1 | 1 55 #define pi 3.14159265359 56 #define RT return 57 #define lowbit(x) x & (-x) 58 #define onecnt(x) __builtin_popcount(x) 59 typedef long long LL; 60 typedef long double LD; 61 typedef unsigned long long ULL; 62 typedef pair<int, int> pii; 63 typedef pair<string, int> psi; 64 typedef pair<LL, LL> pll; 65 typedef map<string, int> msi; 66 typedef vector<int> vi; 67 typedef vector<LL> vl; 68 typedef vector<vl> vvl; 69 typedef vector<bool> vb; 70 71 const int maxn = 110; 72 int nu, nv; 73 int G[maxn][maxn]; 74 int linker[maxn]; 75 bool vis[maxn]; 76 77 bool dfs(int u) { 78 For(v, 1, nv+1) { 79 if(G[u][v] && !vis[v]) { 80 vis[v] = 1; 81 if(linker[v] == -1 || dfs(linker[v])) { 82 linker[v] = u; 83 return 1; 84 } 85 } 86 } 87 return 0; 88 } 89 90 int hungary() { 91 int ret = 0; 92 Clr(linker, -1); 93 For(u, 1, nu+1) { 94 Cls(vis); 95 if(dfs(u)) ret++; 96 } 97 return ret; 98 } 99 100 int n, m, k; 101 vector<pii> ans; 102 103 int main() { 104 // FRead(); 105 while(~Rint(n)) { 106 Cls(vis); Cls(G); ans.clear(); 107 nu = nv = n; 108 For(i, 1, n+1) { 109 For(j, 1, n+1) { 110 Rint(G[i][j]); 111 } 112 } 113 int ret = hungary(); 114 if(ret != n) { 115 puts("-1"); 116 continue; 117 } 118 For(i, 1, nu+1) { 119 int j; 120 for(j = i; j <= nu; j++) { 121 if(linker[j] == i) break; 122 } 123 if(i != j) { 124 ans.push_back(pii(i, j)); 125 swap(linker[i], linker[j]); 126 } 127 } 128 printf("%d\n", ans.size()); 129 Rep(i, ans.size()) printf("C %d %d\n", ans[i].first, ans[i].second); 130 } 131 RT 0; 132 }
转载于:https://www.cnblogs.com/kirai/p/5804288.html
[HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)相关推荐
- 二分图最大匹配—匈牙利算法
二分图:又叫二部图,图G中顶点集V可以分成互不相交的子集(X,Y),并且图中的每一条边所关联的点分别属于两个不同的顶点集,则图G叫二分图.(不含奇环) 二分图的匹配:给定一个二分图G的子图M,M的边集 ...
- 二分图最大匹配-匈牙利算法
今天介绍 匈牙利算法 : 匈牙利算法,是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,由匈牙利数学家Edmonds于1965年提出,因而得名. 先介绍一下 ...
- 二分图最大匹配 - 匈牙利算法
问题描述: X集合(编号1~m),Y集合(编号m+1~n).n,m<100. 给出若干组合(x, y)(相当于映射x->y),问最都能同时有几个组合(分配). 分析: 题目可能简化描述得不 ...
- 二分图最大匹配——匈牙利算法
二分图最大匹配 (一).二分图的介绍 1.定义 2.充要条件 (二).二分图的匹配 1.二分图的最大匹配 2.增广路径 3.匈牙利算法 (1).复杂度 (2).算法思路 (3).代码实现 (一).二分 ...
- 二分图最大匹配(匈牙利算法Dinic算法)
二分图最大匹配: 给出一个二分图,左边有若干个节点,右边有若干个节点,左边的节点想到匹配右边的节点,每个左边的节点每个都有若干个可以选择的对象,每个左边节点只能选择一个右边节点,每个右边节点也只能被选 ...
- 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement
题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...
- NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)
月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...
- NYOJ - 239 - 月老的难题 ( 二分图最大匹配 匈牙利算法 )
描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭. 现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸 ...
- 二分图最大匹配 -- 匈牙利算法
Algorithm.( Augmenting Path Algorithm ) Input: An X-Y bigraph G, a matching M in G, and the ...
最新文章
- shell 跟踪命令
- Eclipse搭建java分布式商城项目
- 【BZOJ】1823: [JSOI2010]满汉全席(2-sat)
- JAVA线程池原理以及几种线程池类型介绍
- 在CentOS上安装FFMPEG和Gstream-ffmpeg
- 圆弧半径计算图解_刀尖圆弧半径补偿G40,G41,G42 左补偿右补偿你真的能搞清楚吗...
- 从挂科学渣到史上学历最低诺奖得主,他用17年时间重新证明自己
- market1501 data_manager.py
- R的数据可视化,各种图表,常用统计量计算
- JSTL表达式的理解和使用
- 终于搞定了一个C#的聊天室 使用的SQLServer+VS 用的Socket 整理下搜的书签
- Sublime 使用笔记(九):汉字乱码问题的解决方法
- RPL(9):RFC6550翻译(9)---安全机制
- 将OKRA-ERP配置成固定资产实物管理全过程
- 大数据开发是做什么的?怎样入门?
- A quick first look at the kernel printk()
- 对redis的keys方法替换
- [生存志] 第84节 列子淡泊号冲虚
- 群辉 RAID1 数据恢复小记
- c语言中fcntl.h函数库,fcntl函数的使用详解
热门文章
- ci框架 mysql_CodeIgniter (CI)框架中的数据库查询汇总
- linux蓝牙设备无法打开,linux 下 无线 wifi 蓝牙 无法启用
- 平年闰年c语言源代码,C语言平年闰年问题
- android读取工程目录下的文件,Android编程实现读取工程中的txt文件功能
- matlab中的mkdir函数_科学网—Matlab中计算函数运行时间的三种方法及判断新建文件夹 - 张伟的博文...
- Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式
- Matplitlib绘图入门1,这一篇就够了
- 读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(3):Segmentation
- 基于U-Net系列算法的医学图像分割(课程设计)
- keras 的 example 文件 pretrained_word_embeddings.py 解析