HDU 1045 Fire Net 二分图建图
题意:
在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害。炮台会向四面发射子弹。
思路:
把行列分开做,先处理行,把同一行中相互联通的点缩成一个点。再处理列,同样缩成一个点。然后把行列中,交点不是墙的点连一条边。对这个图跑网络流或者二分图匹配即可。
- #include <algorithm>
- #include <iterator>
- #include <iostream>
- #include <cstring>
- #include <cstdlib>
- #include <iomanip>
- #include <bitset>
- #include <cctype>
- #include <cstdio>
- #include <string>
- #include <vector>
- #include <stack>
- #include <cmath>
- #include <queue>
- #include <list>
- #include <map>
- #include <set>
- #include <cassert>
- #include <unordered_map>
- using namespace std;
- //#pragma GCC optimize(3)
- //#pragma comment(linker, "/STACK:102400000,102400000") //c++
- // #pragma GCC diagnostic error "-std=c++11"
- // #pragma comment(linker, "/stack:200000000")
- // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #define lson (l , mid , rt << 1)
- #define rson (mid + 1 , r , rt << 1 | 1)
- #define debug(x) cerr << #x << " = " << x << "\n";
- #define pb push_back
- #define pq priority_queue
- #define max3(a,b,c) max(max(a,b),c)
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair<ll ,ll > pll;
- typedef pair<int ,int > pii;
- typedef pair<int,pii> p3;
- //priority_queue<int> q;//这是一个大根堆q
- //priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
- #define fi first
- #define se second
- //#define endl '\n'
- #define OKC ios::sync_with_stdio(false);cin.tie(0)
- #define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
- #define REP(i , j , k) for(int i = j ; i < k ; ++i)
- //priority_queue<int ,vector<int>, greater<int> >que;
- const ll mos = 0x7FFFFFFF; //
- const ll nmos = 0x80000000; //-2147483648
- const int inf = 0x3f3f3f3f;
- const ll inff = 0x3f3f3f3f3f3f3f3f; //
- const int mod = 1e9+;
- const double esp = 1e-;
- const double PI=acos(-1.0);
- template<typename T>
- inline T read(T&x){
- x=;int f=;char ch=getchar();
- while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
- while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
- return x=f?-x:x;
- }
- /*-----------------------showtime----------------------*/
- char mp[][];
- int idx[][];
- struct edge{
- int u,v,cap,flag;
- edge(){}
- edge(int u,int v,int cap,int flag):u(u),v(v),cap(cap),flag(flag){}
- }es[];
- int tot,s,t;
- vector<int>tab[];
- int dis[],cur[];
- void addedge(int u,int v,int cap){
- // debug(u);
- tab[u].pb(tot);
- es[tot++] = edge(u,v,cap,);
- tab[v].pb(tot);
- es[tot++] = edge(v,u,,);
- }
- bool bfs(){
- queue<int>q; q.push(s);
- memset(dis,inf,sizeof(dis));
- dis[s] = ;
- while(!q.empty()){
- int h = q.front(); q.pop();
- for(int i=; i<tab[h].size(); i++){
- edge & e = es[tab[h][i]];
- if(e.cap > && dis[e.v] >= inf){
- dis[e.v] = dis[h] + ;
- q.push(e.v);
- }
- }
- }
- return dis[t] < inf;
- }
- int dfs(int x,int maxflow){
- if(x == t || maxflow == ) return maxflow;
- for(int i=cur[x] ; i<tab[x].size(); i++){
- cur[x] = i;
- edge & e = es[tab[x][i]];
- if(dis[e.v] == dis[x] + && e.cap > ){
- int flow = dfs(e.v, min(maxflow, e.cap));
- if(flow){
- e.cap -= flow;
- es[tab[x][i] ^ ].cap += flow;
- return flow;
- }
- }
- }
- return ;
- }
- int dinic(){
- int ans = ;
- while(bfs()){
- int flow;
- memset(cur,,sizeof(cur));
- do{
- flow = dfs(s,inf);
- if(flow) ans += flow;
- }while(flow);
- }
- return ans;
- }
- int main(){
- int n; scanf("%d", &n);
- while(~scanf("%d", &n) && n){
- memset(idx, -, sizeof(idx));
- tot = ;
- for(int i=; i<n; i++) scanf("%s", mp[i]);
- s = , t = ;
- for(int i=s; i<=t; i++)tab[i].clear();
- int totx = ;
- for(int i=; i<n; i++){
- for(int j=; j<n; j++){
- if(mp[i][j] == '.') idx[i][j] = totx;
- else totx++;
- }
- totx++;
- }
- int p = totx;
- for(int i=; i<totx; i++) addedge(s, i, );
- for(int i=; i<n; i++){
- for(int j=; j<n; j++){
- if(mp[j][i] == '.' ) {
- // vis[idx[j][i]] = 1;
- addedge(idx[j][i], totx, );
- }
- else if(mp[j][i] == 'X') totx++;
- }
- totx++;
- }
- for(int i=p; i<=totx; i++) addedge(i, t, );
- printf("%d\n", dinic());
- }
- return ;
- }
HDU 1045
HDU 1045 Fire Net 二分图建图的更多相关文章
- HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)
(点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...
- hdu 1045 Fire Net 二分图匹配 && HDU-1281-棋盘游戏
题意:任意两个个'车'不能出现在同一行或同一列,当然如果他们中间有墙的话那就没有什么事,问最多能放多少个'车' 代码+注释: 1 //二分图最大匹配问题 2 //难点在建图方面,如果这个图里面一道墙也 ...
- 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(行列匹配变形+缩点建图)
题意:n*n的棋盘上放置房子.同一方同一列不能有两个,除非他们之间被墙隔开,这种话. 把原始图分别按行和列缩点 建图:横竖分区.先看每一列.同一列相连的空地同一时候看成一个点,显然这种区域不可以同一时 ...
- 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 【连通块的压缩 二分图匹配】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 1045 Fire Net(二分图)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意为给定一个最大为4*4的棋盘,棋盘可以放置堡垒,处在同一行或者同一列的堡垒可以相互攻击, ...
- 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 ...
随机推荐
- Linux中更新firefox
从官网下载Firefox压缩包放在/usr/lib/目录下(应用程序一般都在这个文件夹下) tar jxfv [压缩包名] 解压得到文件夹firefox在解压得到的firefox文件夹中有一个fir ...
- poj 2503 Babelfish(字典树或map或哈希或排序二分)
输入若干组对应关系,然后输入应该单词,输出对应的单词,如果没有对应的输出eh 此题的做法非常多,很多人用了字典树,还有有用hash的,也有用了排序加二分的(感觉这种方法时间效率最差了),这里我参考了M ...
- java学习笔记(中级篇)—java实现高质量图片压缩
使用java几十行代码实现一个高质量图片压缩程序,再也不用去自己找网络的压缩程序啦!而且很多网上的工具还有水印或者其他的限制,自己动手写一个简单的应用,是再合适不过了. 一.实现原理 1.声明两个字符 ...
- Fragment 使用详解
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- 干货 | 博云基于OVS自研容器网络插件在金融企业的落地实践
本文根据博云在dockerone社区微信群分享内容整理 过去几年博云在企业中落地容器云平台遇到了很多痛点,其中一个比较典型的痛点来自网络方面,今天很高兴跟大家聊聊这个话题并介绍下我们基于OVS自研的C ...
- Spring aop 拦截自定义注解+分组验证参数
import com.hsq.common.enums.ResponseState;import com.hsq.common.response.ResponseVO;import org.aspec ...
- 逆向破解之160个CrackMe —— 001
CrackMe —— 001 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- American daily English notes (enlarged edition): A review
Life English is the most pragmatic kind of English when one wants to associate with foreigner friend ...
- 12、面向对象的思想(OOP)
面向对象与面向过程 1.都是解决问题的思维方式,都是代码的组织的方式: 2.解决简单的问题可以使用面向过程: 3.解决复杂的问题建议使用面向对象,微观处理依旧会使用面向过程. 对象的进化史(数据管理的 ...
- Zookeeeper环境搭建(二)
zk一般是有2n+1个节点组成的集群.在Zookeeper服务有两个角色,一个是leader,负责写服务和数据同步:剩下的是follower,提供读服务.(为什么是2n+1个节点请看paxos算法) ...