HDU 1045 Fire Net(行列匹配变形+缩点建图)
题意:n*n的棋盘上放置房子。同一方同一列不能有两个,除非他们之间被墙隔开,这种话。
把原始图分别按行和列缩点
建图:横竖分区。先看每一列。同一列相连的空地同一时候看成一个点,显然这种区域不可以同一时候放两个点。
这些点作为二分图的X部。同理在对全部的 行用同样的方法缩点。作为Y部。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<cstdlib>
#define lson (rt<<1),L,M
#define rson (rt<<1|1),M+1,R
#define M ((L+R)>>1)
#define cl(a,b) memset(a,b,sizeof(a));
#define LL long long
#define P pair<int,int>
#define X first
#define Y second
#define pb push_back
#define fread(zcc) freopen(zcc,"r",stdin)
#define fwrite(zcc) freopen(zcc,"w",stdout)
using namespace std;
const int maxn=505;
const int inf=999999;
vector<int> G[maxn];
int matching[maxn];
bool vis[maxn];
int num;
bool dfs(int u){
int N=G[u].size();
for(int i=0;i<N;i++){
int v=G[u][i];
if(vis[v])continue;
vis[v]=true;
if(matching[v]==-1||dfs(matching[v])){
matching[v]=u;
return true;
}
}
return false;
}
int hungar(){
int ans=0;
cl(matching,-1);
for(int i=0;i<num;i++){
cl(vis,false);
if(dfs(i))ans++;
}
return ans;
}
char a[maxn][maxn];
int row[maxn][maxn];
int col[maxn][maxn];
int main(){
// fread("Text/in.txt");
int n;
while(scanf("%d",&n)&&n){
for(int i=0;i<n;i++){
scanf("%s",a[i]);
}
cl(row,-1);
cl(col,-1);
int cnt=0,cnt2=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]=='.'){
int k=j;
bool ok=false;//依照行缩点,进行编号
while(k<n&&a[i][k]=='.'&&row[i][k]==-1){
row[i][k]=cnt;k++;ok=true;
}
if(ok)cnt++;
k=i;
ok=false;//依照列编号
while(i<n&&a[k][j]=='.'&&col[k][j]==-1){
col[k][j]=cnt2;k++;ok=true;
}
if(ok)cnt2++;
}
}
}
num++;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]=='.'){
G[row[i][j]].pb(col[i][j]);
num++;
}
}
}
printf("%d\n",hungar());
for(int i=0;i<maxn;i++)G[i].clear();
}
return 0;
}
HDU 1045 Fire Net(行列匹配变形+缩点建图)的更多相关文章
- hdu 1045 Fire Net(二分匹配 or 暴搜)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1045 Fire Net 二分图匹配 && HDU-1281-棋盘游戏
题意:任意两个个'车'不能出现在同一行或同一列,当然如果他们中间有墙的话那就没有什么事,问最多能放多少个'车' 代码+注释: 1 //二分图最大匹配问题 2 //难点在建图方面,如果这个图里面一道墙也 ...
- HDU 1045(Fire Net)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...
- HDOJ(HDU).1045 Fire Net (DFS)
HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...
- hdu 1045 Fire Net(最小覆盖点+构图(缩点))
http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS Memory Limit:32768KB ...
- HDU 1045 Fire Net 【连通块的压缩 二分图匹配】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1045 Fire Net 二分图建图
HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...
- HDU 1045——Fire Net——————【最大匹配、构图、邻接矩阵做法】
Fire Net Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- hdu 1045 Fire Net(二分图)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意为给定一个最大为4*4的棋盘,棋盘可以放置堡垒,处在同一行或者同一列的堡垒可以相互攻击, ...
随机推荐
- POJ——T 1961 Period
http://poj.org/problem?id=1961 Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 18542 ...
- 洛谷 P1852 奇怪的字符串
P1852 奇怪的字符串 题目描述 输入两个01串,输出它们的最长公共子序列的长度 输入输出格式 输入格式: 一行,两个01串 输出格式: 最长公共子序列的长度 输入输出样例 输入样例#1: 复制 0 ...
- 使用maven的tomcat:run进行web项目热部署
近期又又一次看了一下maven的东西,事实上主要是由于去了解Jenkins,后期或许会补充jenkins的博文. 怎么在eclipse里面创建maven webproject,这边就不介绍了,參见:h ...
- C. Arthur and Table(Codeforces Round #311 (Div. 2) 贪心)
C. Arthur and Table time limit per test 1 second memory limit per test 256 megabytes input standard ...
- uiautomator——第一个例子:打开浏览器,输入网址
1.在sdk安装目录:E:\Test_Tools\auto_test\app\adt-bundle-windows-x86-20131030\sdk\tools下启动uiautomatorviewer ...
- Windows 下 Sublime Text 默认打开方式问题解决办法
Sublime Text 2 是很受ACMer喜爱的文本编辑器 但是绿色版删除后无法设置为默认打开方式...而且网上也没有给出明确的解决办法 注册表的解决办法: 删除 HKEY_CURRENT_USE ...
- WPF 入门《常用控件》
1.GroupBox 注意: GroupBox仍然需要布局容器来放置元素.如: StackPanel面板 <GroupBox Header="select number?"& ...
- 18. springboot整合jsp
转自:https://blog.csdn.net/u012562943/article/details/51836729
- C# mongodb帮助类
这是在C#连接MongoDB的帮助类,所使用的驱动是在Vs2015的Nuget管理器中下载的mongodb驱动. 下载第一个,会自动下载下面的两个,不要删除. 在配置文件中配置连接字符串connStr ...
- multi_input_paths