题目:hdoj1045

题意:给出一个图。当中有 . 和 X 两种,. 为通路,X表示墙,在当中放炸弹,然后炸弹不能穿过墙。问你最多在图中能够放多少个炸弹?

分析:这道题目是在上海邀请赛的题目的数据简化版。数据水了,所以有非常多方法,这里讲二分图最大匹配,题目难点在于建图

想到用暴力过。可是事实证明我想多了。

然后又想到多重二分匹配,后来发现没有办法表示图中的行列中墙的阻隔,后来看了别人的建图,瞬间认为高大上。

建图,首先把每一行中的能够放一个炸弹的一块区域标记为同一个数字。数字不反复,然后列做同样的处理,即缩点。

缩点之后原图矩阵中每一个点都对用一个行数字和一个列数字,然后依照这两个数字进行二分匹配,其同样值仅仅取一个,得到的结果就是ans;

注意:每次推断增广的时候首先检查一下当前点有没有匹配。假设匹配就不用搜索,由于有多个值相应一个点,所以...

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. const int N = 10;
  8. #define Del(x,y) memset(x,y,sizeof(x))
  9. char map[N][N];
  10. int path[N][N];
  11. int line[N][N],row[N][N],link[N],vis[N],vlink[N];
  12. int n,cnt_row,cnt_line;
  13. bool dfs(int x)
  14. {
  15. for(int i=0;i<cnt_line;i++)
  16. {
  17. if(path[x][i]==1 && vis[i]==0)
  18. {
  19. vis[i]=1;
  20. if(link[i]==-1 || dfs(link[i]))
  21. {
  22. link[i]=x;
  23. vlink[x]=i;
  24. return true;
  25. }
  26. }
  27. }
  28. return false;
  29. }
  30. void solve()
  31. {
  32. int ans=0;
  33. Del(link,-1);
  34. Del(vlink,-1);
  35. for(int i=0;i<cnt_row;i++)
  36. {
  37. if(vlink[i]==-1){ ///注意!标记找过的
  38. Del(vis,0);
  39. if(dfs(i))
  40. ans++;
  41. }
  42. }
  43. printf("%d\n",ans);
  44. }
  45. int main()
  46. {
  47. //freopen("Input.txt","r",stdin);
  48. while(~scanf("%d",&n) && n)
  49. {
  50. char c;
  51. Del(map,0);
  52. for(int i=0;i<n;i++)
  53. {
  54. getchar();
  55. for(int j=0;j<n;j++)
  56. scanf("%c",&map[i][j]);
  57. }
  58. Del(line,-1);
  59. Del(row,-1);
  60. cnt_row=0,cnt_line=0;
  61. for(int i=0;i<n;i++)
  62. {
  63. for(int j=0;j<n;j++)
  64. {
  65. if(map[i][j] == '.' && row[i][j] == -1)
  66. {
  67. for(int k = j; map[i][k] == '.' && k < n; ++k)
  68. row[i][k] = cnt_row;
  69. cnt_row++;
  70. }
  71. if(map[j][i] == '.' && line[j][i] == -1)
  72. {
  73. for(int k = j; map[k][i] == '.' && k < n; ++k)
  74. line[k][i] = cnt_line;
  75. cnt_line++;
  76. }
  77. }
  78. }
  79. Del(path,0);
  80. for(int i=0;i<n;i++)
  81. {
  82. for(int j=0;j<n;j++)
  83. {
  84. if(map[i][j]=='.')
  85. path[row[i][j]][line[i][j]]=1;
  86. }
  87. }
  88. solve();
  89. }
  90. return 0;
  91. }

二分图最大匹配 hdoj 1045的更多相关文章

  1. HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...

  2. HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)

    (点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...

  3. hdoj--1045<dfs&二分图最大匹配>(这里是dfs解法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目描述: 在矩阵中放车,车可四面攻击,矩阵中有墙,可以防止攻击,给出墙的位置,输出最多可以放多 ...

  4. POJ 2226二分图最大匹配

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...

  5. POJ2239 Selecting Courses(二分图最大匹配)

    题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ...

  6. poj 2239 二分图最大匹配,基础题

    1.poj 2239   Selecting Courses   二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...

  7. UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法

    二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...

  8. 二分图最大匹配的K&#246;nig定理及其证明

     二分图最大匹配的K?nig定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K?nig定理证了,其它的废话一概没有.    以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上 ...

  9. DFS ZOJ 1002/HDOJ 1045 Fire Net

    题目传送门 /* 题意:在一个矩阵里放炮台,满足行列最多只有一个炮台,除非有墙(X)相隔,问最多能放多少个炮台 搜索(DFS):数据小,4 * 4可以用DFS,从(0,0)开始出发,往(n-1,n-1 ...

随机推荐

  1. Visual Studio的ASP.NET修改默认打开浏览器

    1.新建web空应用程序,输入项目名称. 2.右击项目名称,添加“新建项”—一般处理程序 3.右击新建一个HTML文件,任意命名. 4.右击新建的Html文件,选择“浏览方式” 5.选择后弹出浏览器选 ...

  2. 寻找数列中第k大的数算法分析

    问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...

  3. 密码输入模块getpass

    getpass模块用于命令行输入密码,它提供了两个函数.         getpass.getpass([prompt[, stream]])         提示用户输入密码,同时不显示输入的密码 ...

  4. 不小心中了machook病毒

    此文运用的是优雅的Markdown而书 前段回家过年的日子,我心爱的小air在运行时不停的弹出"machook停止运行"的提醒,上网google一下不看不要紧,才得知是mac上的一 ...

  5. PHP学习(变量)

    PHP学习(变量) 1. PHP属于松散类型,创建变量时不用指定类型. 2.变量命名规范: 1)第一个字符必须是$ 2)$后的第一个字符必须是 字母 或 下划线 3)其他字符可以是 字母, 数字, 下 ...

  6. QTableView表格滚动条样式(QSS真是细致到家了)

    环境:Qt5.3 IDE:QtCreator 效果预览: 垂直与水平滚动条样式 代码: ui->QTableView->verticalScrollBar()->setStyleSh ...

  7. HDU2577:How to Type(DP)

    Problem Description Pirates have finished developing the typing software. He called Cathy to test hi ...

  8. Scrambled Polygon(斜率排序)

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7799   Accepted: 3707 ...

  9. ORACLE 使用RMAN管理归档日志 archived log

    oracle 归档日志通常使用rman进行管理,作为备份集的一部分 正常情况下,可以根据方法删除 1 过期策略 crosscheck archivelog all; delete expired ar ...

  10. MVC设计模式JavaWeb实现

    JSP开发模式 jsp开发模式的发展 1.模式1:(适合小型项目的技术的开发)     a.第一版本号.纯jsp(封装数据.处理数据,显示数据)     b.第二版本号,Jsp+JavaBean.   ...