二分图最大匹配 hdoj 1045
题目: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的更多相关文章
- HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)
(点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...
- hdoj--1045<dfs&二分图最大匹配>(这里是dfs解法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目描述: 在矩阵中放车,车可四面攻击,矩阵中有墙,可以防止攻击,给出墙的位置,输出最多可以放多 ...
- POJ 2226二分图最大匹配
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...
- POJ2239 Selecting Courses(二分图最大匹配)
题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ...
- poj 2239 二分图最大匹配,基础题
1.poj 2239 Selecting Courses 二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...
- UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法
二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...
- 二分图最大匹配的König定理及其证明
二分图最大匹配的K?nig定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K?nig定理证了,其它的废话一概没有. 以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上 ...
- DFS ZOJ 1002/HDOJ 1045 Fire Net
题目传送门 /* 题意:在一个矩阵里放炮台,满足行列最多只有一个炮台,除非有墙(X)相隔,问最多能放多少个炮台 搜索(DFS):数据小,4 * 4可以用DFS,从(0,0)开始出发,往(n-1,n-1 ...
随机推荐
- Visual Studio的ASP.NET修改默认打开浏览器
1.新建web空应用程序,输入项目名称. 2.右击项目名称,添加“新建项”—一般处理程序 3.右击新建一个HTML文件,任意命名. 4.右击新建的Html文件,选择“浏览方式” 5.选择后弹出浏览器选 ...
- 寻找数列中第k大的数算法分析
问题描述:给定一系列数{a1,a2,...,an},这些数无序的,现在求第k大的数. 看到这个问题,首先想到的是先排序,然后直接输出第k大的数,于是得到啦基于排序的算法 算法一: #include&l ...
- 密码输入模块getpass
getpass模块用于命令行输入密码,它提供了两个函数. getpass.getpass([prompt[, stream]]) 提示用户输入密码,同时不显示输入的密码 ...
- 不小心中了machook病毒
此文运用的是优雅的Markdown而书 前段回家过年的日子,我心爱的小air在运行时不停的弹出"machook停止运行"的提醒,上网google一下不看不要紧,才得知是mac上的一 ...
- PHP学习(变量)
PHP学习(变量) 1. PHP属于松散类型,创建变量时不用指定类型. 2.变量命名规范: 1)第一个字符必须是$ 2)$后的第一个字符必须是 字母 或 下划线 3)其他字符可以是 字母, 数字, 下 ...
- QTableView表格滚动条样式(QSS真是细致到家了)
环境:Qt5.3 IDE:QtCreator 效果预览: 垂直与水平滚动条样式 代码: ui->QTableView->verticalScrollBar()->setStyleSh ...
- HDU2577:How to Type(DP)
Problem Description Pirates have finished developing the typing software. He called Cathy to test hi ...
- Scrambled Polygon(斜率排序)
Scrambled Polygon Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7799 Accepted: 3707 ...
- ORACLE 使用RMAN管理归档日志 archived log
oracle 归档日志通常使用rman进行管理,作为备份集的一部分 正常情况下,可以根据方法删除 1 过期策略 crosscheck archivelog all; delete expired ar ...
- MVC设计模式JavaWeb实现
JSP开发模式 jsp开发模式的发展 1.模式1:(适合小型项目的技术的开发) a.第一版本号.纯jsp(封装数据.处理数据,显示数据) b.第二版本号,Jsp+JavaBean. ...