*【HDU - 2819】Swap(二分图匹配,输出路径)(待证明:是否是最少交换次数?)

题干:

Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. Can you find a way to make all the diagonal entries equal to 1?

Input

There are several test cases in the input. The first line of each test case is an integer N (1 <= N <= 100). Then N lines follow, each contains N numbers (0 or 1), separating by space, indicating the N*N matrix.

Output

For each test case, the first line contain the number of swaps M. Then M lines follow, whose format is “R a b” or “C a b”, indicating swapping the row a and row b, or swapping the column a and column b. (1 <= a, b <= N). Any correct answer will be accepted, but M should be more than 1000. 

If it is impossible to make all the diagonal entries equal to 1, output only one one containing “-1”. 

Sample Input

2
0 1
1 0
2
1 0
1 0

Sample Output

1
R 1 2
-1

解题报告:

    看到数据量,猜到二分图。然后仔细分析二分图确实是可解的,正好二分图自带记录路径,,可能还是不是很熟练吧第一反应没有建模成二分图。左侧是行,右侧是列,然后跑二分图就可以了、题目没说求最短的变换次数,只是说一个specialjudge唯一要求是小于1000的变换次数。所以用二分图找到之后,那最多就是变换n次嘛(但是也有可能小于n次,比如第一个样例,就直接换了一次凑出俩来,严谨来讲(n/2)<=cnt<=n),n<=100,所以肯定满足题意啊。如果说求最少的变换次数,那就应该先把(ans[i]== j && ans[j] == i)的找出来,然后再遍历剩下的?(但是感觉好像和直接遍历的  次数差不多啊。。但是不太会证明、、)

AC代码:(140ms)

#include<bits/stdc++.h>using namespace std;
const int MAX = 100 + 5;
bool used[MAX];
int line[MAX][MAX],nxt[MAX],ans[MAX],n,cnt;
bool find(int x) {for(int i = 1; i<=n; i++) {if(line[x][i] && used[i] == 0) {used[i]=1;if(nxt[i] == 0 || find(nxt[i])) {nxt[i] = x;return 1;}}}return 0;
}
int main()
{while(~scanf("%d",&n)) {cnt = 0;memset(line,0,sizeof line);memset(ans,0,sizeof ans);memset(nxt,0,sizeof nxt);for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {scanf("%d",&line[i][j]);}}for(int i = 1; i<=n; i++) {memset(used,0,sizeof used);if(find(i)) cnt++;}if(cnt != n) {puts("-1");continue;}cnt = 0;for(int i = 1; i<=n; i++) {ans[nxt[i]] = i;//ans[i] = j   第i列应该等于第j列 //或者说 第i行换到第j行 }for(int i = 1; i<=n; i++) {if(ans[i] != i) {//如果这行需要换for(int j = i+1; j<=n; j++) {if(ans[j] == i) {swap(ans[i],ans[j]);cnt++;}}}}printf("%d\n",cnt);for(int i = 1; i<=n; i++) {ans[nxt[i]] = i;//ans[行] = 列 }for(int i = 1; i<=n; i++) {if(ans[i] != i) {for(int j = i+1; j<=n; j++) {if(ans[j] == i) {printf("R %d %d\n",i,j);swap(ans[i],ans[j]);}}}}} return 0 ;} 

总结:

        for(int i = 1; i<=n; i++) {
            ans[nxt[i]] = i;//ans[行] = 列 
        }

这一行作用是:ans[i]=j,表示第i行应该换到第j行。(你如果最后输出是C的,也就是换列的,那就不需要这个转换了)

还有一点值得注意,我们的思路不是 如果第i行需要换(即ans[i]=j),则把i和j交换,并且用一个bk数组标记第j行已经完成,再从1找第一个bk=0的行,然后再进行交换。(这样会使代码写起来复杂。而且每次都得从i=1开始找,因为有可能ans[i]=j其中j<i?不知道会不会有这种可能性)(但是时间复杂度是不会变的,因为每次都会有一个行被确定下来)

当然,也可以AC,下面是部分代码:(140ms)

		for(int i = 1; i<=n; i++) {ans[nxt[i]] = i;//ans[行] = 列 }int flag = 0;while(1) {flag = 0;for(int i = 1; i<=n; i++) {if(ans[i] != i) {flag = 1;int j = ans[i];printf("R %d %d\n",i,j);swap(ans[i],ans[j]);break;}}			if(flag == 0) break;} 

但是,我们不妨换个思路,扫到这行i之后,然后现在我们的想法是要把这样固定下来,也就是,从后面的行中找到一行假设为j,使得ans[j] = i , 也就是用第j行来确定第i行,然后这两行交换,这样一个for循环扫每一行就可以了,扫到一行,就从后面的行中找一行来确定这一行。就ok了。至于为什么从i+1行开始,是因为第1~(i-1)行,都已经是ans[i]=i了呀,这也就是这两个方法的不同。(前者是找到一个可以更新别的行的行,然后去更新后面的行;后者是枚举每一行,然后从后面找一行来更新这一行。不过代码实现起来都是if(ans[i] != i)这一句)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS中属性个属性值怎么区分,[CSS] 详细解释 @media 属性与 (max

前言现在 HTML5/CSS3 很流行罢&#xff0c;也是未来时代的趋势。在 HTML5 带来的许多实用功能之后&#xff0c;CSS3也同带来了一些牛逼哄哄的功能呢。动画 animation转化 transform过渡 translation尽快这已足够让我们兴奋&#xff0c;许多之前必须用 JS 或 JQ 写的效果用 CSS …

西门子精智和精简面板区别_西门子S7-1200的功能与特点,应用范围介绍

S7-1200是西门子公司新推出的一款面向离散自动化系统和独立自动化系统的低端PLC。S7-1200采用了模块化设计&#xff0c;具备强大的工艺功能&#xff0c;适用于多种场合&#xff0c;可以满足不同的自动化需求。S7-1200的定位处于原有的SIMATIC S7-200和SIMATIC S7-300之间&#…

【HDU - 1281 】棋盘游戏 (经典的二分图匹配,匈牙利算法,枚举删除顶点,必须边,关建边)

题干&#xff1a; 小希和Gardon在玩一个游戏&#xff1a;对一个N*M的棋盘&#xff0c;在格子里放尽量多的一些国际象棋里面的“车”&#xff0c;并且使得他们不能互相攻击&#xff0c;这当然很简单&#xff0c;但是Gardon限制了只有某些格子才可以放&#xff0c;小希还是很轻松…

eclipse提示方法已过时_提高效率,eclipse上你可能不知道的技巧

一张思维导图1、控制台(console )日志输出另保存经常会遇到这种情况&#xff0c;习惯性的清掉控制台上的输出日志&#xff0c;再然后发现刚才的日志居然还有用&#xff0c;不得不又重新调试一遍&#xff0c;为了解决这种“手贱”的问题&#xff0c;我在网上搜了一些资料&#x…

【CodeForces - 144B 】Meeting (暴力枚举,水题,计算几何)

题干&#xff1a; The Super Duper Secret Meeting of the Super Duper Secret Military Squad takes place in a Super Duper Secret Place. The place is an infinite plane with introduced Cartesian coordinate system. The meeting table is represented as a rectangle…

html中超链接使用_干货 | HTML中表格的使用方法

HTML中的表格是由表格的标签组成HTML中的表格是由标签用于定义表格的列&#xff0c;标签为又是标签来分割列&#xff0c;形成一个完整的表格。表格的标签组合关系为&#xff1a;我是单元格1我是单元格2表格中可以插入文本、图片、列表、段落、表单、水平线等任何html标签&#…

chrome插件中调用ajax,Chrome扩展程序中的Ajax调用无效

尝试在Chrome扩展程序中发送ajax请求。我已经确认请求返回200响应&#xff0c;它应该只是console.log来测试&#xff06;&#xff03;39;。我不确定这里是否存在异常问题&#xff1f;我已经阅读了Chrome扩展程序&#xff06;&#xff03;39; addListener&#xff06;&#xff0…

【CodeForces - 144C】Anagram Search(尺取,滑窗问题,处理字符串计数)

题干&#xff1a; A string t is called an anagram of the string s, if it is possible to rearrange letters in t so that it is identical to the string s. For example, the string "aab" is an anagram of the string "aba" and the string "…

互补品的交叉弹性系数_重庆事业单位综合备考:需求价格弹性和需求交叉价格弹性有何区别...

需求价格弹性 VS 需求交叉价格弹性一、需求价格弹性指某种商品随着价格的变化&#xff0c;该商品需求变化的程度大小(这里指的是同一种商品)。或者说&#xff0c;是需求变化相对于价格变化的敏感程度。假设&#xff1a;黄金、IPONE手机等商品降价50%&#xff0c;一定会大卖&…

esxi服务器与虚拟机时间不符,vsphere6.7-虚拟机与ESXI时间同步

ELF Format 笔记(十五)—— 符号哈希表ilocker:关注 Android 安全(新手) QQ: 2597294287 符号哈希表用于支援符号表的访问,能够提高符号搜索速度. 下表用于解释该哈希表的组织,但该格式并不属于 ELF 规范. ...AD域修改组策略如果我们的计算机加入AD域之后,修改安全策略时不能用…

朋友圈自动回复评论_微信新版,朋友圈可以表情包回复了!网友:评论区斗起来.jpg...

你们发现了吗&#xff1f;朋友圈可以发表情包评论了&#xff01;微信iOS版7.0.9正式版今天迎来更新支持发消息时可以引用之前的内容更令人惊喜的是不少网友都发现新版本还新增朋友圈自定义表情评论功能可以用表情包评论别人的朋友圈内容了&#xff01;轻触表情包还可以查看大图…

【CodeForces - 144D】Missile Silos(单源最短路,枚举中间边,枚举情况可能性)

题干&#xff1a; A country called Berland consists of n cities, numbered with integer numbers from 1to n. Some of them are connected by bidirectional roads. Each road has some length. There is a path from each city to any other one by these roads. Accordi…

第九大陆服务器未找到文件,第九大陆服务器优化规则说明 拍卖行和寄售功能关闭公告...

第九大陆已经确定了六月份服务器的优化时间与规则&#xff0c;同时为了配合6月8日的服务器优化实施&#xff0c;拍卖行将于6月5日关闭&#xff0c;待服务器优化完成后即可开放&#xff01;给大家带来的不便&#xff0c;敬请您谅解&#xff01;《第九大陆》服务器优化详细规则说…

【牛客 - 210A】游戏(思维,脑洞)

题干&#xff1a; BLUESKY007,fengxunling和dreagonm三个人发现了一个像素游戏,这款神奇的游戏每次会生成一个nxm的网格,其中每一个格子都被随机染色为R,G,B三种颜色之一,每次都可以选择任意一个非B颜色的格子进行一次操作,每次操作都会满足以下规则&#xff1a; 1.操作的范围为…

建房子 最安全图纸_妄想山海初期该怎么办?砍树狩猎建房子,还能拆别人的房子...

妄想山海还是一个很有趣的游戏&#xff0c;唯一的缺点就是游戏对手机配置要求比较高&#xff0c;手机太差的玩家&#xff0c;就别想那么多了&#xff0c;希望等游戏正式上线&#xff0c;能优化的好一些吧&#xff01;在测试中&#xff0c;玩家能体验到游戏中的各种玩法&#xf…

【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )

题干&#xff1a; Rain has pummeled the cows field, a rectangular grid of R rows and C columns (1 < R < 50, 1 < C < 50). While good for the grass, the rain makes some patches of bare earth quite muddy. The cows, being meticulous grazers, dont w…

springboot的原生cache_springboot-shiro-redis-session-cache

1.配置mysql和redis redis的需要配置密码 原生jedis的使用相对于spring-data-redis更加灵活 所以本项目用原生jedis来直接作为缓存使用 具体使用方法请参看相关配置 特别注意如果mysql是5.7以上版本&#xff0c;请去掉sql_mode中的ONLY_FULL_GROUP_BY 本项目用户支持多角色多部…

【51Nod - 1272 】最大距离 (思维,排序sort的空间优化)

题干&#xff1a; 给出一个长度为N的整数数组A&#xff0c;对于每一个数组元素&#xff0c;如果他后面存在大于等于该元素的数&#xff0c;则这两个数可以组成一对。每个元素和自己也可以组成一对。例如&#xff1a;{5, 3, 6, 3, 4, 2}&#xff0c;可以组成11对&#xff0c;如…

javaweb在线问卷系统_2020 最新流行的Java Web报表工具比对

随着信息系统的高速发展&#xff0c;报表平台逐渐成为了信息系统当中最为核心和重要的功能模块。报表工具有助于将原始数据可视化显示&#xff0c;使决策者或者相关人员能够一览整体的数据趋势&#xff0c;完整的报表解决方案会提供多样的表格数据展示、数据可视化元素&#xf…

python 深copy_python中的深copy和浅copy

bytesPython bytes/strbytes 在Python3中作为一种单独的数据类型&#xff0c;不能拼接&#xff0c;不能拼接&#xff0c;不能拼接>>> €20.encode(utf-8)b\xe2\x82\xac20>>> b\xe2\x82\xac20.decode(utf-8)€20解码>>> b\xa420.decode(windows-1255…