HDU 1045

题意:

  在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害。炮台会向四面发射子弹。

思路:

  把行列分开做,先处理行,把同一行中相互联通的点缩成一个点。再处理列,同样缩成一个点。然后把行列中,交点不是墙的点连一条边。对这个图跑网络流或者二分图匹配即可。

  1. #include <algorithm>
  2. #include <iterator>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <iomanip>
  7. #include <bitset>
  8. #include <cctype>
  9. #include <cstdio>
  10. #include <string>
  11. #include <vector>
  12. #include <stack>
  13. #include <cmath>
  14. #include <queue>
  15. #include <list>
  16. #include <map>
  17. #include <set>
  18. #include <cassert>
  19. #include <unordered_map>
  20. using namespace std;
  21. //#pragma GCC optimize(3)
  22. //#pragma comment(linker, "/STACK:102400000,102400000") //c++
  23. // #pragma GCC diagnostic error "-std=c++11"
  24. // #pragma comment(linker, "/stack:200000000")
  25. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  26.  
  27. #define lson (l , mid , rt << 1)
  28. #define rson (mid + 1 , r , rt << 1 | 1)
  29. #define debug(x) cerr << #x << " = " << x << "\n";
  30. #define pb push_back
  31. #define pq priority_queue
  32. #define max3(a,b,c) max(max(a,b),c)
  33.  
  34. typedef long long ll;
  35. typedef unsigned long long ull;
  36.  
  37. typedef pair<ll ,ll > pll;
  38. typedef pair<int ,int > pii;
  39. typedef pair<int,pii> p3;
  40.  
  41. //priority_queue<int> q;//这是一个大根堆q
  42. //priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
  43. #define fi first
  44. #define se second
  45. //#define endl '\n'
  46.  
  47. #define OKC ios::sync_with_stdio(false);cin.tie(0)
  48. #define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
  49. #define REP(i , j , k) for(int i = j ; i < k ; ++i)
  50. //priority_queue<int ,vector<int>, greater<int> >que;
  51.  
  52. const ll mos = 0x7FFFFFFF; //
  53. const ll nmos = 0x80000000; //-2147483648
  54. const int inf = 0x3f3f3f3f;
  55. const ll inff = 0x3f3f3f3f3f3f3f3f; //
  56. const int mod = 1e9+;
  57. const double esp = 1e-;
  58. const double PI=acos(-1.0);
  59.  
  60. template<typename T>
  61. inline T read(T&x){
  62. x=;int f=;char ch=getchar();
  63. while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
  64. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  65. return x=f?-x:x;
  66. }
  67.  
  68. /*-----------------------showtime----------------------*/
  69.  
  70. char mp[][];
  71. int idx[][];
  72.  
  73. struct edge{
  74. int u,v,cap,flag;
  75. edge(){}
  76. edge(int u,int v,int cap,int flag):u(u),v(v),cap(cap),flag(flag){}
  77. }es[];
  78.  
  79. int tot,s,t;
  80. vector<int>tab[];
  81. int dis[],cur[];
  82. void addedge(int u,int v,int cap){
  83. // debug(u);
  84. tab[u].pb(tot);
  85. es[tot++] = edge(u,v,cap,);
  86. tab[v].pb(tot);
  87. es[tot++] = edge(v,u,,);
  88. }
  89.  
  90. bool bfs(){
  91. queue<int>q; q.push(s);
  92. memset(dis,inf,sizeof(dis));
  93. dis[s] = ;
  94. while(!q.empty()){
  95. int h = q.front(); q.pop();
  96. for(int i=; i<tab[h].size(); i++){
  97. edge & e = es[tab[h][i]];
  98. if(e.cap > && dis[e.v] >= inf){
  99. dis[e.v] = dis[h] + ;
  100. q.push(e.v);
  101. }
  102. }
  103. }
  104. return dis[t] < inf;
  105. }
  106.  
  107. int dfs(int x,int maxflow){
  108. if(x == t || maxflow == ) return maxflow;
  109. for(int i=cur[x] ; i<tab[x].size(); i++){
  110. cur[x] = i;
  111. edge & e = es[tab[x][i]];
  112. if(dis[e.v] == dis[x] + && e.cap > ){
  113. int flow = dfs(e.v, min(maxflow, e.cap));
  114. if(flow){
  115. e.cap -= flow;
  116.  
  117. es[tab[x][i] ^ ].cap += flow;
  118. return flow;
  119. }
  120. }
  121. }
  122. return ;
  123. }
  124.  
  125. int dinic(){
  126. int ans = ;
  127. while(bfs()){
  128.  
  129. int flow;
  130. memset(cur,,sizeof(cur));
  131. do{
  132. flow = dfs(s,inf);
  133. if(flow) ans += flow;
  134. }while(flow);
  135.  
  136. }
  137. return ans;
  138. }
  139. int main(){
  140. int n; scanf("%d", &n);
  141. while(~scanf("%d", &n) && n){
  142. memset(idx, -, sizeof(idx));
  143.  
  144. tot = ;
  145. for(int i=; i<n; i++) scanf("%s", mp[i]);
  146. s = , t = ;
  147. for(int i=s; i<=t; i++)tab[i].clear();
  148. int totx = ;
  149. for(int i=; i<n; i++){
  150. for(int j=; j<n; j++){
  151. if(mp[i][j] == '.') idx[i][j] = totx;
  152. else totx++;
  153. }
  154. totx++;
  155. }
  156. int p = totx;
  157. for(int i=; i<totx; i++) addedge(s, i, );
  158. for(int i=; i<n; i++){
  159. for(int j=; j<n; j++){
  160. if(mp[j][i] == '.' ) {
  161. // vis[idx[j][i]] = 1;
  162. addedge(idx[j][i], totx, );
  163. }
  164. else if(mp[j][i] == 'X') totx++;
  165. }
  166. totx++;
  167. }
  168. for(int i=p; i<=totx; i++) addedge(i, t, );
  169. printf("%d\n", dinic());
  170. }
  171.  
  172. return ;
  173. }

HDU 1045

HDU 1045 Fire Net 二分图建图的更多相关文章

  1. HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)

    (点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...

  2. hdu 1045 Fire Net 二分图匹配 && HDU-1281-棋盘游戏

    题意:任意两个个'车'不能出现在同一行或同一列,当然如果他们中间有墙的话那就没有什么事,问最多能放多少个'车' 代码+注释: 1 //二分图最大匹配问题 2 //难点在建图方面,如果这个图里面一道墙也 ...

  3. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  4. HDU 1045 Fire Net(行列匹配变形+缩点建图)

    题意:n*n的棋盘上放置房子.同一方同一列不能有两个,除非他们之间被墙隔开,这种话. 把原始图分别按行和列缩点 建图:横竖分区.先看每一列.同一列相连的空地同一时候看成一个点,显然这种区域不可以同一时 ...

  5. HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...

  6. HDU 1045 Fire Net 【连通块的压缩 二分图匹配】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)    ...

  7. hdu 1045 Fire Net(二分图)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意为给定一个最大为4*4的棋盘,棋盘可以放置堡垒,处在同一行或者同一列的堡垒可以相互攻击, ...

  8. HDU 1045(Fire Net)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...

  9. hdu 1045 Fire Net(二分匹配 or 暴搜)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. Linux中更新firefox

    从官网下载Firefox压缩包放在/usr/lib/目录下(应用程序一般都在这个文件夹下) tar jxfv [压缩包名]  解压得到文件夹firefox在解压得到的firefox文件夹中有一个fir ...

  2. poj 2503 Babelfish(字典树或map或哈希或排序二分)

    输入若干组对应关系,然后输入应该单词,输出对应的单词,如果没有对应的输出eh 此题的做法非常多,很多人用了字典树,还有有用hash的,也有用了排序加二分的(感觉这种方法时间效率最差了),这里我参考了M ...

  3. java学习笔记(中级篇)—java实现高质量图片压缩

    使用java几十行代码实现一个高质量图片压缩程序,再也不用去自己找网络的压缩程序啦!而且很多网上的工具还有水印或者其他的限制,自己动手写一个简单的应用,是再合适不过了. 一.实现原理 1.声明两个字符 ...

  4. Fragment 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  5. 干货 | 博云基于OVS自研容器网络插件在金融企业的落地实践

    本文根据博云在dockerone社区微信群分享内容整理 过去几年博云在企业中落地容器云平台遇到了很多痛点,其中一个比较典型的痛点来自网络方面,今天很高兴跟大家聊聊这个话题并介绍下我们基于OVS自研的C ...

  6. Spring aop 拦截自定义注解+分组验证参数

    import com.hsq.common.enums.ResponseState;import com.hsq.common.response.ResponseVO;import org.aspec ...

  7. 逆向破解之160个CrackMe —— 001

    CrackMe —— 001 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  8. 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 ...

  9. 12、面向对象的思想(OOP)

    面向对象与面向过程 1.都是解决问题的思维方式,都是代码的组织的方式: 2.解决简单的问题可以使用面向过程: 3.解决复杂的问题建议使用面向对象,微观处理依旧会使用面向过程. 对象的进化史(数据管理的 ...

  10. Zookeeeper环境搭建(二)

    zk一般是有2n+1个节点组成的集群.在Zookeeper服务有两个角色,一个是leader,负责写服务和数据同步:剩下的是follower,提供读服务.(为什么是2n+1个节点请看paxos算法) ...