题目:hdoj1045

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

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

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

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

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

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

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

代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10;
#define Del(x,y) memset(x,y,sizeof(x))
char map[N][N];
int path[N][N];
int line[N][N],row[N][N],link[N],vis[N],vlink[N];
int n,cnt_row,cnt_line;
bool dfs(int x)
{
for(int i=0;i<cnt_line;i++)
{
if(path[x][i]==1 && vis[i]==0)
{
vis[i]=1;
if(link[i]==-1 || dfs(link[i]))
{
link[i]=x;
vlink[x]=i;
return true;
}
}
}
return false;
}
void solve()
{
int ans=0;
Del(link,-1);
Del(vlink,-1);
for(int i=0;i<cnt_row;i++)
{
if(vlink[i]==-1){ ///注意!标记找过的
Del(vis,0);
if(dfs(i))
ans++;
}
}
printf("%d\n",ans);
}
int main()
{
//freopen("Input.txt","r",stdin);
while(~scanf("%d",&n) && n)
{
char c;
Del(map,0);
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<n;j++)
scanf("%c",&map[i][j]);
}
Del(line,-1);
Del(row,-1);
cnt_row=0,cnt_line=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j] == '.' && row[i][j] == -1)
{
for(int k = j; map[i][k] == '.' && k < n; ++k)
row[i][k] = cnt_row;
cnt_row++;
}
if(map[j][i] == '.' && line[j][i] == -1)
{
for(int k = j; map[k][i] == '.' && k < n; ++k)
line[k][i] = cnt_line;
cnt_line++;
}
}
}
Del(path,0);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]=='.')
path[row[i][j]][line[i][j]]=1;
}
}
solve();
}
return 0;
}

二分图最大匹配 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. DropDownList为啥总是获取第一项的值???

    小菜: DropDownList控件绑定的数据,在获取数据时总是获取到第一项,很是郁闷,怎么回事,于是就各种想,都没有找到问题的原因. 请看下面的代码 前台代码: <asp:DropDownLi ...

  2. MVC下载Excel

    方法1: public ActionResult DownExcel() { var stream = list.Select(p => new { p.UserName, p.Mobile, ...

  3. js 中日期 转换成时间戳 例如2013-08-30 转换为时间戳

    //时间格式2014-02-02 14:10:00改成时间戳 //此时构造出来的时间是:2013/03/08 00:00:00. //这样得到的是一个数值,表示的是从1970年1月1日0点0分0秒到d ...

  4. 51NOD 算法马拉松8

    题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...

  5. 百度下载google 浏览器安装失败

    installer integrity check has failed. Common causes include incomplete download and damaged media co ...

  6. 网页往数据库里插数据要用utf8,否则就乱码

    把网页的这行<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ...

  7. Python collections.defaultdict 笔记

    其实defaultdict 就是一个字典,只不过python自动的为它的键赋了一个初始值.这也就是说,你不显示的为字典的键赋初值python不会报错,看下实际例子. 比如你想计算频率 frequenc ...

  8. VS2008一个小bug

    vc工程的项目属性里MFC的使用有三项:默认“使用标准windows库”,修改为“在静态库中使用MFC”,然后再改回默认,项目变化如下: 今天的工程在改过后编译不能通过,手工把0改回2(1改回3)后O ...

  9. (Problem 74)Digit factorial chains

    The number 145 is well known for the property that the sum of the factorial of its digits is equal t ...

  10. IOS UIActionSheet的使用方法

    在IOS的用户接口向导中,苹果提供了另外一种显示警告框的手法,叫做UIActionSheet.它和UIAlertView比起来不会显得过于急切和紧张.而是很温和地在继续流程之前给用户提供了诸多选择. ...