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的棋盘,棋盘可以放置堡垒,处在同一行或者同一列的堡垒可以相互攻击, ...
随机推荐
- 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!
乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...
- Android 控件:CheckBox
首先,在布局文件里注冊CheckBox activity_main.xml <LinearLayout xmlns:android="http://schemas.android.co ...
- Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))
1.回想 上篇 使用 Volley 的 JsonObjectRequest 和 ImageLoader 写了 电影列表的样例 2.重点 (1)封装Volley 内部 请求 类(请求队列,数据请求,图片 ...
- Dos图像复制成序列
rem 输入1.png,在当前文件下复制.0000.png--0002.png rem 注:way2是不等待0001.png运行完就開始运行下一个了. rem 假设要等待上一个运行完后,再往下顺弃运行 ...
- 一个令人蛋疼的NDK链接错误
背景 我们APP的引擎包engine.so.包括了A.B.C三个project.但每次都是源代码形式编译,导致svn上存在多份同样代码拷贝. 很不科学. ..核心的Bproject由我维护.整个SO编 ...
- jquery 04
$('div').slice(1,3).css('background','red').end().css('color','blue'); 入栈原理图: <!DOCTYPE HTML> ...
- android图片特效处理之怀旧效果
图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...
- 18.C语言多线程总结
创建一个线程 _beginthread(myfun, , NULL);//返回值是一个HANDLE hd[i] = CreateThread(NULL, , add, NULL, , NULL);// ...
- mahout的特性(三)
mahout的特性 虽然在开源领域中相对较为年轻,但 Mahout 已经提供了大量功能,特别是在集群和CF 方面. Mahout 的主要特性包括: Taste CF.Taste 是 Sean Owen ...
- 15、python学习手册之:元组、文件及其他
1.使用文本来存储python对象时,必须使用转换工具把对象转成字符串 2.内置函数eval可以把字符串当做可执行程序代码:eg s = ‘[1,2,3]’ eval(s) -->[1, ...