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

【题目大意】

  给出一个棋盘,由白格子和黑格子组成,可以交换棋盘的行列,
  使得其主对角线为黑格子,其余均为白格子,问是否能达成,
  如果能达成输出交换步骤,否则输出-1

【题解】

  我们对于所有的黑格子将其从属的行标和列标相连,做一遍二分图匹配,
  对于每一行拥有的黑块如果不是在对应的列,我们就将这一行和对应的行互换,

【代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <vector>
  5. using namespace std;
  6. const int MAX_V=2000;
  7. int V,match[MAX_V];
  8. vector<int> G[MAX_V];
  9. bool used[MAX_V];
  10. void add_edge(int u,int v){
  11. G[u].push_back(v);
  12. G[v].push_back(u);
  13. }
  14. bool dfs(int v){
  15. used[v]=1;
  16. for(int i=0;i<G[v].size();i++){
  17. int u=G[v][i],w=match[u];
  18. if(w<0||!used[w]&&dfs(w)){
  19. match[v]=u;
  20. match[u]=v;
  21. return 1;
  22. }
  23. }return 0;
  24. }
  25. int bipartite_matching(){
  26. int res=0;
  27. memset(match,-1,sizeof(match));
  28. for(int v=0;v<V;v++){
  29. if(match[v]<0){
  30. memset(used,0,sizeof(used));
  31. if(dfs(v))res++;
  32. }
  33. }return res;
  34. }
  35. const int MAX_N=1010;
  36. int N,x,R[MAX_N],C[MAX_N];
  37. void solve(){
  38. V=N*2;
  39. for(int i=0;i<V;i++)G[i].clear();
  40. for(int i=0;i<N;i++)for(int j=0;j<N;j++){
  41. scanf("%d",&x);
  42. if(x)add_edge(i,N+j);
  43. }
  44. if(bipartite_matching()!=N)puts("-1");
  45. else{
  46. printf("%d\n",N);
  47. for(int i=0;i<N;i++){
  48. R[match[i+N]+1]=i+1;
  49. C[i+1]=match[i+N]+1;
  50. }
  51. for(int i=1;i<=N;i++){
  52. printf("R %d %d\n",i,C[i]);
  53. C[R[i]]=C[i];
  54. R[C[i]]=R[i];
  55. }
  56. }
  57. }
  58. int main(){
  59. while(~scanf("%d",&N))solve();
  60. return 0;
  61. }

HDU 2819 Swap(二分图匹配)的更多相关文章

  1. HDU - 2819 Swap (二分图匹配-匈牙利算法)

    题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...

  2. E - Swap - hdu 2819(简单二分图匹配)

    题意:如果可以交换行列,问主对角线能不能全为1 分析:要想主对角线全为1很明显要有N个行列不想同的点就行了,可以用二分图匹配计算出来多能有几个.如果小与N就不能.输出要是对的就行,不必和答案一样 ** ...

  3. 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 ...

  4. HDU 2819 - Swap - [二分图建模+最大匹配]

    题目链接:https://cn.vjudge.net/problem/HDU-2819 Given an N*N matrix with each entry equal to 0 or 1. You ...

  5. HDU 2819 — Swap 二分匹配

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. HDU 2819 Swap (行列匹配+输出解)

    题意:是否能使对角线上全是1 ,这个简单直接按行列匹配.难在路径的输出,我们知道X,Y左右匹配完了之后,不一定是1–1,2–2,3–3--这种匹配.可能是1–3,2–1,3–2,我们要把他们交换成前一 ...

  7. HDU 2819 Swap (二分匹配+破输出)

    题意:给定上一个01矩阵,让你变成一个对角全是 1 的矩阵. 析:二分匹配,把行和列看成两个集合,用匈牙利算法就可以解决,主要是在输出解,在比赛时一紧张不知道怎么输出了. 输出应该是要把 match[ ...

  8. HDU 2819 ——Swap——————【最大匹配、利用linker数组、邻接表方式】

     Swap Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  9. A - Fire Net - hdu 1045(二分图匹配)

    题意:一个阵地可以向四周扫射,求出来最多能修多少个阵地,墙不可以被扫射透,阵地不能同行或者或者列(有墙隔着例外) 分析:很久以前就做过这道题..当时是练习深搜来着,不过时间复杂度比较高,现在再看突然发 ...

随机推荐

  1. 深入理解Java虚拟机—内存管理机制

    前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...

  2. 使用vue开发webApp,安卓手机自带回退键的问题解决

    首先,我先为大家说明,为什么我要写这篇随笔: 因为我们写的webapp,在安卓手机上,按一次回退键,就会退出app,回到桌面,而不是像原生app一样,会有一个提示,例如,“再按一次退出应用”的这种提示 ...

  3. JS学习笔记之页面信息滚动效果

    效果截图: 1.无缝滚动效果 JS代码: <script> window.onload=function(){ var oInfobox=document.getElementById(' ...

  4. 调用webservice接口

    这里是cxf服务器,采用myeclipse6.5,把wsdl放到本地的方式. 新建一个包, 把解析到的类放在这个包下面. 生成的代码结构: 调用: public static String callI ...

  5. java基础学习(一)hashcode

    hashcode的作用 hashCode()方法是从Object类继承过来的,Object类中的hashCode()方法返回的是对象在内存中地址转换成的int值,如果对象没有重写hashCode()方 ...

  6. 关于Javascript 闭包的理解

    一.什么是闭包? 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话 ...

  7. bzoj 2819 博弈论

    我们可以把 n为偶数的时候,n*n的棋盘看成若干个不相交的2*1的格子,那么对于每个2*1的格子,如果先手选了其中的一个,另一个人都可以选另一个,所以最后使先手没有可以选的格子,先手必败(这里的先手并 ...

  8. 转:Python网页解析:BeautifulSoup vs lxml.html

    转自:http://www.cnblogs.com/rzhang/archive/2011/12/29/python-html-parsing.html Python里常用的网页解析库有Beautif ...

  9. Django-Form 补充

    一.Form的前端循环 class LoginForm(Form): name = ... pwd = ... def func(request): form = LoginForm() return ...

  10. Jenkins安装配置过程及问题详解

    1:去官网下载jenkins.war包. 官网地址:http://Jenkins-ci.org/ 下载win版 官网镜像地址:http://mirrors.jenkins-ci.org/war-sta ...