题目链接: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(二分图最大匹配, 匈牙利算法)相关推荐

  1. 二分图最大匹配—匈牙利算法

    二分图:又叫二部图,图G中顶点集V可以分成互不相交的子集(X,Y),并且图中的每一条边所关联的点分别属于两个不同的顶点集,则图G叫二分图.(不含奇环) 二分图的匹配:给定一个二分图G的子图M,M的边集 ...

  2. 二分图最大匹配-匈牙利算法

    今天介绍 匈牙利算法 : 匈牙利算法,是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,由匈牙利数学家Edmonds于1965年提出,因而得名. 先介绍一下 ...

  3. 二分图最大匹配 - 匈牙利算法

    问题描述: X集合(编号1~m),Y集合(编号m+1~n).n,m<100. 给出若干组合(x, y)(相当于映射x->y),问最都能同时有几个组合(分配). 分析: 题目可能简化描述得不 ...

  4. 二分图最大匹配——匈牙利算法

    二分图最大匹配 (一).二分图的介绍 1.定义 2.充要条件 (二).二分图的匹配 1.二分图的最大匹配 2.增广路径 3.匈牙利算法 (1).复杂度 (2).算法思路 (3).代码实现 (一).二分 ...

  5. 二分图最大匹配(匈牙利算法Dinic算法)

    二分图最大匹配: 给出一个二分图,左边有若干个节点,右边有若干个节点,左边的节点想到匹配右边的节点,每个左边的节点每个都有若干个可以选择的对象,每个左边节点只能选择一个右边节点,每个右边节点也只能被选 ...

  6. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...

  7. NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  8. NYOJ - 239 - 月老的难题 ( 二分图最大匹配 匈牙利算法 )

    描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭. 现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸 ...

  9. 二分图最大匹配 -- 匈牙利算法

    Algorithm.( Augmenting Path Algorithm ) Input:     An X-Y bigraph G, a matching M in G,     and the ...

最新文章

  1. shell 跟踪命令
  2. Eclipse搭建java分布式商城项目
  3. 【BZOJ】1823: [JSOI2010]满汉全席(2-sat)
  4. JAVA线程池原理以及几种线程池类型介绍
  5. 在CentOS上安装FFMPEG和Gstream-ffmpeg
  6. 圆弧半径计算图解_刀尖圆弧半径补偿G40,G41,G42 左补偿右补偿你真的能搞清楚吗...
  7. 从挂科学渣到史上学历最低诺奖得主,他用17年时间重新证明自己
  8. market1501 data_manager.py
  9. R的数据可视化,各种图表,常用统计量计算
  10. JSTL表达式的理解和使用
  11. 终于搞定了一个C#的聊天室 使用的SQLServer+VS 用的Socket 整理下搜的书签
  12. Sublime 使用笔记(九):汉字乱码问题的解决方法
  13. RPL(9):RFC6550翻译(9)---安全机制
  14. 将OKRA-ERP配置成固定资产实物管理全过程
  15. 大数据开发是做什么的?怎样入门?
  16. A quick first look at the kernel printk()
  17. 对redis的keys方法替换
  18. [生存志] 第84节 列子淡泊号冲虚
  19. 群辉 RAID1 数据恢复小记
  20. c语言中fcntl.h函数库,fcntl函数的使用详解

热门文章

  1. ci框架 mysql_CodeIgniter (CI)框架中的数据库查询汇总
  2. linux蓝牙设备无法打开,linux 下 无线 wifi 蓝牙 无法启用
  3. 平年闰年c语言源代码,C语言平年闰年问题
  4. android读取工程目录下的文件,Android编程实现读取工程中的txt文件功能
  5. matlab中的mkdir函数_科学网—Matlab中计算函数运行时间的三种方法及判断新建文件夹 - 张伟的博文...
  6. Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式
  7. Matplitlib绘图入门1,这一篇就够了
  8. 读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(3):Segmentation
  9. 基于U-Net系列算法的医学图像分割(课程设计)
  10. keras 的 example 文件 pretrained_word_embeddings.py 解析