https://vjudge.net/problem/UVA-12264

题意:

有很多个阵地,分为敌方和己方,每个士兵可以移动到相邻的己方的阵地,但是只能移动一步。

现在要让与敌方相邻的阵地中士兵最少的最多。

思路:

最少的最多,那显然二分。

二分这个最少的值。拆点,敌方阵地不管,S向己方阵地\(i\)向连边,容量为本阵地士兵的数量,\(i'\)向T连边,如果是与敌方相邻的阵地,那么容量为二分的值;如果是处于己方阵地的包围,那么容量为1即可。最后跑最大流判断是否满流。

STD:

本STD在uva上AC,uvalive上WA,请谨慎食用。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <vector>
  6. using namespace std;
  7. const int inf = 0x3f3f3f3f;
  8. const int N = 205;
  9. int a[N];
  10. char s[N][N];
  11. bool is[N];
  12. struct edge
  13. {
  14. int u,v,cap;
  15. edge(int u,int v,int cap):u(u),v(v),cap(cap){}
  16. edge(){}
  17. };
  18. vector<edge> es;
  19. vector<int> G[N];
  20. int n,S,T;
  21. int dis[N],cur[N];
  22. void adde(int u,int v,int cap)
  23. {
  24. es.push_back(edge(u,v,cap));
  25. es.push_back(edge(v,u,0));
  26. int sz = es.size();
  27. G[u].push_back(sz-2);
  28. G[v].push_back(sz-1);
  29. }
  30. bool bfs()
  31. {
  32. memset(dis,inf,sizeof dis);
  33. dis[S] = 0;
  34. queue<int> q;
  35. q.push(S);
  36. while (!q.empty())
  37. {
  38. int u = q.front();
  39. q.pop();
  40. for (int i = 0;i < G[u].size();i++)
  41. {
  42. edge &e = es[G[u][i]];
  43. int v = e.v;
  44. if (e.cap > 0 && dis[v] >= inf)
  45. {
  46. dis[v] = dis[u] + 1;
  47. q.push(v);
  48. }
  49. }
  50. }
  51. return dis[T] < inf;
  52. }
  53. int dfs(int u,int flow)
  54. {
  55. if (u == T) return flow;
  56. for (int i = cur[u];i < G[u].size();i++)
  57. {
  58. cur[u] = i;
  59. edge &e = es[G[u][i]];
  60. int v = e.v;
  61. if (dis[v] == dis[u] + 1 && e.cap > 0)
  62. {
  63. int tmp = dfs(v,min(e.cap,flow));
  64. if (tmp)
  65. {
  66. e.cap -= tmp;
  67. es[G[u][i]^1].cap += tmp;
  68. return tmp;
  69. }
  70. }
  71. }
  72. return 0;
  73. }
  74. int dinic()
  75. {
  76. int ans = 0;
  77. while (bfs())
  78. {
  79. int tmp;
  80. memset(cur,0,sizeof(cur));
  81. while (tmp = dfs(S,inf)) ans += tmp;
  82. }
  83. return ans;
  84. }
  85. bool meet(int lim)
  86. {
  87. for (int i = 0;i < N;i++) G[i].clear();
  88. es.clear();
  89. for (int i = 1;i <= n;i++)
  90. {
  91. if (a[i] <= 0) continue;
  92. adde(S,i,a[i]);
  93. adde(i,i+n,inf);
  94. }
  95. int sum = 0;
  96. for (int i = 1;i <= n;i++)
  97. {
  98. if (a[i] <= 0) continue;
  99. if (is[i])
  100. {
  101. sum += lim;
  102. adde(i+n,T,lim);
  103. }
  104. else
  105. {
  106. sum++;
  107. adde(i+n,T,1);
  108. }
  109. }
  110. for (int i = 1;i <= n;i++)
  111. {
  112. for (int j = 1;j <= n;j++)
  113. {
  114. if (i == j) continue;
  115. if (a[i] <= 0 || a[j] <= 0) continue;
  116. if (s[i][j] == 'Y')
  117. {
  118. adde(i,j+n,inf);
  119. }
  120. }
  121. }
  122. int ans = dinic();
  123. return ans >= sum;
  124. }
  125. int main()
  126. {
  127. int t;
  128. scanf("%d",&t);
  129. while (t--)
  130. {
  131. memset(is,0,sizeof is);
  132. scanf("%d",&n);
  133. S = 0;
  134. T = 2 * n + 1;
  135. for (int i = 1;i <= n;i++)
  136. {
  137. scanf("%d",&a[i]);
  138. }
  139. for (int i = 1;i <= n;i++)
  140. {
  141. scanf("%s",s[i]+1);
  142. }
  143. for (int i = 1;i <= n;i++)
  144. {
  145. for (int j = 1;j <= n;j++)
  146. {
  147. if (a[i] > 0 && a[j] <= 0)
  148. {
  149. if (s[i][j] == 'Y') is[i] = true;
  150. }
  151. }
  152. }
  153. int l = 1,r = 1e5;
  154. while (r - l > 1)
  155. {
  156. int mid = (l + r) >> 1;
  157. if (meet(mid)) l = mid;
  158. else r = mid;
  159. }
  160. while (meet(l+1)) l++;
  161. printf("%d\n",l);
  162. }
  163. return 0;
  164. }
  165. /*
  166. 3
  167. 1 1 0
  168. NYN
  169. YNY
  170. NYN
  171. 7
  172. 7 3 3 2 0 0 5
  173. NYNNNNN
  174. YNYYNNN
  175. NYNYYNN
  176. NYYNYNN
  177. NNYYNNN
  178. NNNNNNY
  179. NNNNNYN
  180. 4
  181. 2 2 0 0
  182. NNYN
  183. NNNY
  184. YNNN
  185. NYNN
  186. */

uva 12264 Risk的更多相关文章

  1. UVA - 12264 Risk (二分,网络流)

    题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了... 最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行. 这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的 ...

  2. Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。

    /** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ...

  3. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

  4. UVa 567: Risk

    这是一道很简单的图论题,只要使用宽度优先搜索(BFS)标记节点间距离即可. 我的解题代码如下: #include <iostream> #include <cstdio> #i ...

  5. UVA 567 Risk【floyd】

    题目链接: option=com_onlinejudge&Itemid=8&page=show_problem&problem=508">https://uva ...

  6. LA 3353 最优巴士线路设计

    给出一个 n 个点的有向图,找若干个圈,是的每个结点恰好属于一个圈.要求总长度尽量小. 三倍经验题 Uva 12264,HDU 1853 这题有两种解法,一是匹配: 每个点只在一个圈中,则他有唯一的前 ...

  7. uva oj 567 - Risk(Floyd算法)

    /* 一张有20个顶点的图上. 依次输入每个点与哪些点直接相连. 并且多次询问两点间,最短需要经过几条路才能从一点到达另一点. bfs 水过 */ #include<iostream> # ...

  8. UVA - 1025 A Spy in the Metro[DP DAG]

    UVA - 1025 A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especia ...

  9. UVa12264 Risk(最大流)

    题目 Source https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

随机推荐

  1. Mac下启动iOS模拟器

    终端列出你安装的所有可用的设备xcrun instruments -s 或 xcrun simctl list 启动方式一: 先启动模拟器:open -a Simulator,这时会以默认的iOS系统 ...

  2. PJzhang:kali linux安装virtualbox虚拟机和chrome浏览器

    猫宁!!! 参考链接: https://www.cnblogs.com/zhishuai/p/8007410.html kali linux 安装virtualbox. 查询系统的版本 apt-cac ...

  3. PJzhang:python基础进阶的10个疗程-two

    猫宁!!! 第2节:python基本图形绘制 保留字是python基础语法的支撑 默写python代码是件挺恐怖的事情!!! 2008年android操作系统诞生 计算时代 编程语言也是一个江湖 C语 ...

  4. 【CodeForces - 682C】Alyona and the Tree(dfs)

    Alyona and the Tree Descriptions 小灵决定节食,于是去森林里摘了些苹果.在那里,她意外地发现了一棵神奇的有根树,它的根在节点 1 上,每个节点和每条边上都有一个数字. ...

  5. linux下安装mysql5.7方法与常见问题

    linux上安装mysql5.7 1.下载tar包,这里使用wget从官网下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7 ...

  6. My life

    突然想到的好笑的: 1. 世界上一共有10种人,一种是男人,另一种是女人 2. 吐槽一个网站的域名: 你这网站域名取得,跟色情网站似的 明知这是一场意外,你要不要来,明知这是一场重伤害,你会不会来: ...

  7. Java-Redis Serializable序列化

    在Java中使用redis存储User对象时,进行JUnit测试时,控制台: 2019-06-24 16:56:45.520 INFO 27688 --- [ main] j.LocalContain ...

  8. vsftpd下载文件时内容乱码

    windows客户端访问Linux服务端的ftp并下载文档时,内容会出现乱码,这是由于vsftpd文件服务器不支持转码功能 通过java FTPClient下载 方法为 OutputStream is ...

  9. Navicat远程无法创建数据库

    Navicat远程无法创建数据库 提示报错信息如下,说明是用户创建的权限不足. Error Code: 1044. Access denied for user 'root'@'%' to datab ...

  10. 解决github pages和github .md文件图片不显示

    博客园上传的图片,在github上无法显示. 在github项目下建立img文件夹,放上图片 两种方式 项目绝对路径 https://raw.githubusercontent.com/用户名/项目名 ...