题目链接  http://acm.hdu.edu.cn/showproblem.php?pid=2819

题目大意很明确,交换图的某些行或者是某些列(可以都换),使得这个N*N的图对角线上全部都是1.

这里有一点需要说明,就是说题目的交换,其实是将原来图的某一行移到最后图的某一行,而不是指先交换两行,得到一个新图,再交换新图的两行。感觉这里比较坑。

这里先说明的一点就是,如果通过交换某些行没有办法的到解的话,那么只交换列 或者 既交换行又交换列 那也没办法得到解。其实个人感觉这个可以用矩阵的秩来解释,所有的对角线都是1,所以也就是矩阵的秩就是N,所以秩小于N就无解。另外,根据矩阵的性质,任意交换矩阵的两行  或者  两列,矩阵的秩不变,也就保证了如果通过 只交换行  或  只交换列 无法得到解的话,那么其他交换形式也必然无解。

既然说是用二分图的最大匹配,那怎么构建二分图呢,我们构建的二分图,第一部分X表示的是横坐标,第二部分Y表示纵坐标,所以范围都是1~N,然后如果a[i][j]是1,那我们就从X的i向Y的j引一条边,那么这条边的含义就可以解释为可以将Y的第j列(因为Y表示的是列的集合)移到第i列,使得a[i][i]变成1,这样就相当于是第i行第i列就变成了1,也就是说对角线多了一个1。

因此我们求这个二分图的最大匹配(目的是为了让每一列只与X中的某一行匹配),这样来就形成了N条边,那我们只需要将所有匹配的边的右边(列)  和  左边(行)所在的列  交换,这样一来对角线上这一行就成了1.

上面也也正好提示了如果最大匹配是N,那就存在解,否则无解。

 1 #include <map>
 2 #include <set>
 3 #include <stack>
 4 #include <queue>
 5 #include <cmath>
 6 #include <ctime>
 7 #include <vector>
 8 #include <cstdio>
 9 #include <cctype>
10 #include <cstring>
11 #include <cstdlib>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 #define eps 1e-15
16 #define MAXN 105
17 #define INF 1000000007
18 #define MAX(a,b) (a > b ? a : b)
19 #define MIN(a,b) (a < b ? a : b)
20 #define mem(a) memset(a,0,sizeof(a))
21
22 bool G[MAXN][MAXN],vis[MAXN];
23 int Left[MAXN],N,M,T,a[MAXN],b[MAXN];
24
25 bool DFS(int u)
26 {
27     for(int v=0;v<=N;v++) if(G[u][v] && !vis[v])
28     {
29         vis[v] = true;
30         if(!Left[v] || DFS(Left[v]))
31         {
32             Left[v] = u;
33             return true;
34         }
35     }
36     return false;
37 }
38
39 int main()
40 {
41     while(~scanf("%d", &N))
42     {
43         mem(G); mem(Left);
44         int x,ans = 0;
45         for(int i=1;i<=N;i++) for(int j=1;j<=N;j++)
46         {
47             scanf("%d", &x);
48             if(x)G[i][j] = true;
49         }
50         for(int i=1;i<=N;i++)//求最大匹配
51         {
52             mem(vis);
53             if(DFS(i)) ans ++;
54         }
55         if(ans < N){printf("-1\n");continue;}//小于N无解
56         int tot = 0,j;
57         for(int i=1;i<=N;i++)
58         {
59             for(j=1;j<=N && Left[j]!=i ;j++);
60             if(i != j)//交换第i列和第j列
61             {
62                 a[tot] = i;  b[tot] = j; tot ++;//记录结果
63                 int t = Left[i]; Left[i] = Left[j]; Left[j] = t;
64             }
65         }
66         printf("%d\n",tot);
67         for(int i=0;i<tot;i++) printf("C %d %d\n", a[i],b[i]);
68     }
69     return 0;
70 }

转载于:https://www.cnblogs.com/gj-Acit/p/3265502.html

HDU2819Swap(二分图最大匹配)相关推荐

  1. 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)

    A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...

  2. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  3. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  4. 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...

  5. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  6. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

  7. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

  8. HDU - 1528 Card Game Cheater(二分图最大匹配)

    题目链接:点击查看 题目大意:题意有点像求田忌赛马的最优解,大概意思就是现在有两个人,每个人都有n张不同的扑克牌,扑克牌的大小首先以点数来确定,点数相同的情况下以花色来决定,红桃(Heart)> ...

  9. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...

  10. CodeForces - 387D George and Interesting Graph(二分图最大匹配+暴力)

    题目链接:点击查看 题目大意:给出n个点和m条边组成的有向图,现在我们需要找出一个点作为中心点,然后增加或减少边的条数以达到下面的目标: 除了中心点外,其他的每个点的入度为2且出度为2 中心点和每个点 ...

最新文章

  1. iOS开发多线程篇—线程安全
  2. CentOS 7 解决丢失 nginx.pid
  3. 7行代码AC——1010 一元多项式求导 (25分)
  4. GNOME Shell Extensions开发介绍
  5. 智能终端会议系统(20)---网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系
  6. Python中fastapi构建的web项目使用pyinstaller打包为exe文件
  7. 一个自定义的C#数据库操作基础类 SqlHelper
  8. pandas + sqlalchemy mysql
  9. [Go实战]goFrame框架初次使用
  10. win10 安装gym[all]与mujoco的踩坑日志
  11. 秀球技:倒和其他无用
  12. BootStrap自定义小图标
  13. android之框架xUtils介绍
  14. 同相放大、反向放大、差分放大电路的开环增益
  15. 使用xlang开发隐形水印制作工具
  16. Release That Record Lock!
  17. 云南开放大学《机械制造基础-形考作业1-6(主观题)》
  18. 解决thinkpad sl410 evc windows7硬盘安装ubuntu12.04以后,windows 无线出现断开网速慢等问题
  19. 小白学剪辑从哪里开始 小白学剪辑用什么软件好
  20. python eel_Python django-eel包_程序模块 - PyPI - Python中文网

热门文章

  1. 监控USB设备插入/拔出写法2
  2. java socket wex5_WeX5集成ActiveMQ+WebSocket实现消息推送
  3. 用linux运行sublime,在Deepin Linux上用Sublime Text3配置GoLang开发环境
  4. unity导出fbx模型_ARTBOOK艺书专栏:Fbx导出杂谈
  5. ReadAndWriteLock(读写锁)
  6. 037_JDK的Iterator接口
  7. html盒子移动动画代码,HTML5/Canvas 盒子追踪动画
  8. java中有ClockPane类吗,JavaFX实现简易时钟效果(二)
  9. python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务
  10. mysql拉荐_荐 一步一步教你MySQL主从复制读写分离