HDU 2819 Swap(二分图匹配)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=2819
【题目大意】
给出一个棋盘,由白格子和黑格子组成,可以交换棋盘的行列,
使得其主对角线为黑格子,其余均为白格子,问是否能达成,
如果能达成输出交换步骤,否则输出-1
【题解】
我们对于所有的黑格子将其从属的行标和列标相连,做一遍二分图匹配,
对于每一行拥有的黑块如果不是在对应的列,我们就将这一行和对应的行互换,
【代码】
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <vector>
- using namespace std;
- const int MAX_V=2000;
- int V,match[MAX_V];
- vector<int> G[MAX_V];
- bool used[MAX_V];
- void add_edge(int u,int v){
- G[u].push_back(v);
- G[v].push_back(u);
- }
- bool dfs(int v){
- used[v]=1;
- for(int i=0;i<G[v].size();i++){
- int u=G[v][i],w=match[u];
- if(w<0||!used[w]&&dfs(w)){
- match[v]=u;
- match[u]=v;
- return 1;
- }
- }return 0;
- }
- int bipartite_matching(){
- int res=0;
- memset(match,-1,sizeof(match));
- for(int v=0;v<V;v++){
- if(match[v]<0){
- memset(used,0,sizeof(used));
- if(dfs(v))res++;
- }
- }return res;
- }
- const int MAX_N=1010;
- int N,x,R[MAX_N],C[MAX_N];
- void solve(){
- V=N*2;
- for(int i=0;i<V;i++)G[i].clear();
- for(int i=0;i<N;i++)for(int j=0;j<N;j++){
- scanf("%d",&x);
- if(x)add_edge(i,N+j);
- }
- if(bipartite_matching()!=N)puts("-1");
- else{
- printf("%d\n",N);
- for(int i=0;i<N;i++){
- R[match[i+N]+1]=i+1;
- C[i+1]=match[i+N]+1;
- }
- for(int i=1;i<=N;i++){
- printf("R %d %d\n",i,C[i]);
- C[R[i]]=C[i];
- R[C[i]]=R[i];
- }
- }
- }
- int main(){
- while(~scanf("%d",&N))solve();
- return 0;
- }
HDU 2819 Swap(二分图匹配)的更多相关文章
- HDU - 2819 Swap (二分图匹配-匈牙利算法)
题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...
- E - Swap - hdu 2819(简单二分图匹配)
题意:如果可以交换行列,问主对角线能不能全为1 分析:要想主对角线全为1很明显要有N个行列不想同的点就行了,可以用二分图匹配计算出来多能有几个.如果小与N就不能.输出要是对的就行,不必和答案一样 ** ...
- 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 - [二分图建模+最大匹配]
题目链接: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 ...
- HDU 2819 Swap (行列匹配+输出解)
题意:是否能使对角线上全是1 ,这个简单直接按行列匹配.难在路径的输出,我们知道X,Y左右匹配完了之后,不一定是1–1,2–2,3–3--这种匹配.可能是1–3,2–1,3–2,我们要把他们交换成前一 ...
- HDU 2819 Swap (二分匹配+破输出)
题意:给定上一个01矩阵,让你变成一个对角全是 1 的矩阵. 析:二分匹配,把行和列看成两个集合,用匈牙利算法就可以解决,主要是在输出解,在比赛时一紧张不知道怎么输出了. 输出应该是要把 match[ ...
- HDU 2819 ——Swap——————【最大匹配、利用linker数组、邻接表方式】
Swap Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- A - Fire Net - hdu 1045(二分图匹配)
题意:一个阵地可以向四周扫射,求出来最多能修多少个阵地,墙不可以被扫射透,阵地不能同行或者或者列(有墙隔着例外) 分析:很久以前就做过这道题..当时是练习深搜来着,不过时间复杂度比较高,现在再看突然发 ...
随机推荐
- How to turn off the binary log for mysqld_multi instances?
Q: MySQL supports running multiple mysqld on the same server. One of the ways is to use mysqld_multi ...
- 一个简易的Python全站抓取系统
很长时间没有更新博客了,前一阵时间在做项目,里面有一个爬虫系统,然后就从里面整理了一点代码做成了一个简易的爬虫系统,还挺实用的. 简单说来,这个爬虫系统的功能就是:给定初始的链接池,然后设定一些参数, ...
- LVS+Keepalived搭建MyCAT高可用負載均衡集群
1.前面我们已经搭建好mysql主主,并且用mycat实现双写功能,主要配置文件: [root@mycat2 conf]# cat schema.xml <?xml version=" ...
- HTML5之SVG详解(一):基本概括
转载自:http://www.cnblogs.com/hupeng/archive/2012/12/21/2828456.html 1.背景 SVG是Scalable Vector Graphics的 ...
- Python 进阶学习笔记
把函数作为参数 import math def add(x, y, f): return f(x) + f(y) print add(, , math.sqrt) map(f, list) 函数 接收 ...
- 基于SSM框架web搜索功能的实现
这里适合选用于jsp搭建的网站,数据库采用MySQL 一.HTML <div class="header_search"> <input type="t ...
- ZOJ1003 Crashing Balloon
Crashing Balloon Time Limit: 2 Seconds Memory Limit: 65536 KB On every June 1st, the Children's ...
- python学习笔记 序列化
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bill',但 ...
- Backbone Collection 源码简谈
一切由一个例子引发: var Man=Backbone.Model.extend({ initilize:function(){ this.bind('change:name',function(){ ...
- HashMap/Hashtable/ConcurrentHashMap区别
HashMap:每个隔间都没锁门,有人想上厕所,管理员指给他一个隔间,里面没人的话正常用,里面有人的话把这个人赶出来然后用. 优点,每个人进来不耽误都能用:缺点,每一个上厕所的人都有被中途赶出来的危险 ...