Swap---hdu2819(最大匹配)
题意:通过交换行或者列来实现对角线(左上角到右下角)上都是1,
首先,如果某行全是0或者某列全是0必然不满足情况输出-1,如果能转换的话,那么必然可以通过全由行(列)变换得到;
还有就是对角线上的N个1,它们各自在不同的行中出现至少一次才可以,
比如样例2中,虽然有两个1,但是它们总是处在同一列,仍然不满足要求,
很明显不能一个行对应两个列,或者说,每一行都应该有至少一个与自己对应的列才能满足条件;
那么将行作为X集合,列作为Y集合,如果map[i][j]==1,那么Xi->Yj连边,求最大匹配,这样的话没有任何一个行被两个列匹配,也就满足了我们的要求,
如果最大匹配==N,那么必然有解,否则必然无解;
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<vector>
- #include<queue>
- #include<string>
- #include<stack>
- #include<map>
- using namespace std;
- #define N 1100
- #define INF 0x3f3f3f3f
- #define met(a, b) memset(a, b, sizeof(a))
- int used[N], G[N][N], vis[N], n;
- int Find(int u)
- {
- for(int i=; i<=n; i++)
- {
- if(!vis[i] && G[u][i])
- {
- vis[i] = ;
- if(!used[i] || Find(used[i]))
- {
- used[i] = u;
- return ;
- }
- }
- }
- return ;
- }
- int main()
- {
- while(scanf("%d", &n) != EOF)
- {
- met(G, );
- for(int i=; i<=n; i++)
- {
- for(int j=; j<=n; j++)
- {
- int op;
- scanf("%d", &op);
- G[i][j] = op;
- }
- }
- int ans = ;
- met(used, );
- for(int i=; i<=n; i++)
- {
- met(vis, );
- ans += Find(i);
- }
- if(ans < n)
- {
- printf("-1\n");
- continue;
- }
- int cnt = , a[N]={}, b[N]={};
- ///相当于是给一个数组used排序的过程,使得交换的次数最少;
- ///每次把i位置上的数,放到应该放的位置,直到当前位置是对应的数为止;
- for(int i=; i<=n; i++)
- {
- while(i != used[i])
- {
- a[cnt] = i;
- b[cnt] = used[i];
- swap(used[i], used[used[i]]);
- cnt ++;
- }
- }
- printf("%d\n", cnt);
- for(int i=; i<cnt; i++)
- printf("C %d %d\n", a[i], b[i]);
- }
- return ;
- }
- /*
- 3
- 0 1 1
- 0 0 1
- 1 0 0
- */
Swap---hdu2819(最大匹配)的更多相关文章
- HDU2819 Swap —— 二分图最大匹配
题目链接:https://vjudge.net/problem/HDU-2819 Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- Swap[HDU2819]
SwapTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission ...
- 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. C ...
- HDU 2819 ——Swap——————【最大匹配、利用linker数组、邻接表方式】
Swap Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu2819 Swap 最大匹配(难题)
题目大意: 给定一个元素的值只有1或者0的矩阵,每次可以交换两行(列),问有没有方案使得对角线上的值都是1.题目没有限制需要交换多少次,也没限制行交换或者列交换,也没限制是主对角线还是副对角线.虽然没 ...
- HDU 2819 - Swap - [二分图建模+最大匹配]
题目链接:https://cn.vjudge.net/problem/HDU-2819 Given an N*N matrix with each entry equal to 0 or 1. You ...
- hdu-2819.swap(二分匹配 + 矩阵的秩基本定理)
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu1281+hdu2819(最大匹配数)
分析:将行和列缩点,即行对应二分图的X部,列对应二分图的Y部,然后交点为连接该行和该列的一条边.匹配时每点都会把整行整列占了,因此就不会出现冲突了. 传送门:hdu1281 棋盘游戏 #include ...
- HDU2819(KB10-E 二分图最大匹配)
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2819 Swap(行列式性质+最大匹配)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2819 题目大意:给你一个n*n的01矩阵,问是否可以通过任意交换整行或者整列使得正对角线上都是1. ...
随机推荐
- 超全面的JavaWeb笔记day23<AJAX>
AJAX AJAX概述 1 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言 ...
- Android中文API
Android中文API http://www.android-doc.com/index.html
- java -jar Test.jar找不到main class问题
如果你写了一些class,编 译到一个jar里面,但是在执行这个jar的时候报错,找不到main class,但是你明明是有的,是不是很郁闷,检查一下你的jar吧. 解压你的jar,打开META-IN ...
- CentOs 设置静态IP 方法[测试没问题]
首先关闭VMware的DHCP: Edit->Virtual Network Editor 选择VMnet8,去掉Use local DHCP service to distribute IP ...
- discuz 文档说明
Discuz 文档说明 基于7.0的标准程序,部分与插件无关的文件不作说明 文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几乎不会用到的文件,大概了解功能就可以了, ...
- cocos2dx游戏--欢欢英雄传说--添加人物
接下来需要导入精灵帧资源,因为之前下载了TexturePacker,然后通过TexturePacker的"Publish sprite sheet"方法可以生成一个.pvr.ccz ...
- Apktool源码解析——第二篇
上一篇讲到ApkDecoder这个类,大部分调用到还是Androlib类,而且上次发现brutall的代码竟然不是最新的,遂去找iBotP.的代码了. 今天来看Androlib的代码: private ...
- 在fedora 18中将普通用户设置为sudo权限
将一般的用户加入sudo组is not in the sudoers file. This incident will be reported 解决方法 在一般用户下执行sudo命令提示xxx is ...
- synchronized同步语句块
用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待比较长时间.在这样的情况下可以使用synchronized同步语句块来解 ...
- SASS环境搭建及HBuilder中sass预编译配置
---------------------------------Ruby环境安装-------------------------------- 至于为什么要安装ruby环境请移步:https:// ...