[BZOJ1163][BZOJ1339][Baltic2008]Mafia

试题描述

匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标点

输入

第一行输入N,M代表车站的总个数,及有多少条双向边连接它们. 2<=n<=200 , 1 <=m<=20000. 第二行给出两个数a,b,代表匪徒的出发点及目标点.1<=a,b<=N,a<>b. 再下来有N行,给出对第i个车站进行布控所需要的Money,其不超过10 000 000 再下来M行,用于描述图的结构.

输出

最少需要多少Money

输入示例

  1.  

输出示例

  1.  

数据规模及约定

见“输入

题解

一个点拆成一个“入点”A 和“出点”B,A → B 连一条容量为权值的有向边,无向边拆分成两个有向边,跑一边最小割。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <stack>
  6. #include <vector>
  7. #include <queue>
  8. #include <cstring>
  9. #include <string>
  10. #include <map>
  11. #include <set>
  12. using namespace std;
  13.  
  14. const int BufferSize = 1 << 16;
  15. char buffer[BufferSize], *Head, *tail;
  16. inline char Getchar() {
  17. if(Head == tail) {
  18. int l = fread(buffer, 1, BufferSize, stdin);
  19. tail = (Head = buffer) + l;
  20. }
  21. return *Head++;
  22. }
  23. int read() {
  24. int x = 0, f = 1; char c = Getchar();
  25. while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
  26. while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
  27. return x * f;
  28. }
  29.  
  30. #define maxn 410
  31. #define maxm 80410
  32. #define oo 2147483647
  33. struct Edge { int from, to, flow; } ;
  34. struct Dinic {
  35. int n, m, s, t, head[maxn], next[maxm];
  36. Edge es[maxm];
  37. int vis[maxn], Q[maxn], hd, tl;
  38. int cur[maxn];
  39. void init(int nn) {
  40. n = nn; m = 0;
  41. memset(head, -1, sizeof(head));
  42. return ;
  43. }
  44. void AddEdge(int a, int b, int c) {
  45. es[m] = (Edge){ a, b, c }; next[m] = head[a]; head[a] = m++;
  46. es[m] = (Edge){ b, a, 0 }; next[m] = head[b]; head[b] = m++;
  47. return ;
  48. }
  49. bool BFS() {
  50. memset(vis, 0, sizeof(vis));
  51. vis[s] = 1;
  52. hd = tl = 0; Q[++tl] = s;
  53. while(hd < tl) {
  54. int u = Q[++hd];
  55. for(int i = head[u]; i != -1; i = next[i]) {
  56. Edge& e = es[i];
  57. if(e.flow && !vis[e.to]) {
  58. vis[e.to] = vis[u] + 1;
  59. Q[++tl] = e.to;
  60. }
  61. }
  62. }
  63. return vis[t] > 0;
  64. }
  65. int DFS(int u, int a) {
  66. if(u == t || !a) return a;
  67. int flow = 0, f;
  68. for(int& i = cur[u]; i != -1; i = next[i]) {
  69. Edge& e = es[i];
  70. if(vis[e.to] == vis[u] + 1 && (f = DFS(e.to, min(a, e.flow)))) {
  71. flow += f; a -= f;
  72. e.flow -= f; es[i^1].flow += f;
  73. if(!a) return flow;
  74. }
  75. }
  76. return flow;
  77. }
  78. int MinCut(int ss, int tt) {
  79. s = ss; t = tt;
  80. int flow = 0;
  81. while(BFS()) {
  82. for(int i = 1; i <= n; i++) cur[i] = head[i];
  83. flow += DFS(s, oo);
  84. }
  85. return flow;
  86. }
  87. } sol;
  88.  
  89. int main() {
  90. int n = read(), m = read();
  91. sol.init(n << 1);
  92. int s = (read() << 1) - 1, t = read() << 1;
  93. for(int i = 1; i <= n; i++) sol.AddEdge((i << 1) - 1, i << 1, read());
  94. for(int i = 1; i <= m; i++) {
  95. int u = read(), v = read();
  96. sol.AddEdge(u << 1, (v << 1) - 1, oo);
  97. sol.AddEdge(v << 1, (u << 1) - 1, oo);
  98. }
  99.  
  100. printf("%d\n", sol.MinCut(s, t));
  101.  
  102. return 0;
  103. }

[BZOJ1163][BZOJ1339][Baltic2008]Mafia的更多相关文章

  1. BZOJ1163&BZOJ1339[Baltic2008]Mafia——最小割

    题目描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警 方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标 ...

  2. bzoj1339[Baltic2008]Mafia*

    bzoj1339[Baltic2008]Mafia 题意: 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控.对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得 ...

  3. [BZOJ1339] [Baltic2008] Mafia / 黑手党

    Description 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价, 现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的 ...

  4. 1339 / 1163: [Baltic2008]Mafia

    1163: [Baltic2008]Mafia Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 96  Solved: 60[Submit][Statu ...

  5. 1163: [Baltic2008]Mafia

    1163: [Baltic2008]Mafia Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 123  Solved: 70[Submit][Stat ...

  6. 【bzoj1163/bzoj1339】[Baltic2008]Mafia 网络流最小割

    题目描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标点 ...

  7. bzoj1339/1163:[Baltic2008]Mafia

    传送门 最小割,割点,模板... 代码: #include<cstdio> #include<iostream> #include<algorithm> #incl ...

  8. [BZOJ1163&1339]Mafia

    [Baltic2008]Mafia 题目 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后, ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. c#取得控制台应用程序根目录

    1.取得控制台应用程序的根目录方法 方法1.Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径方法2.AppDomain.CurrentDomain.Bas ...

  2. Fluent NHibernate关系映射

    1.好处:Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码 实现: (1).首先我 ...

  3. [USACO2005][POJ2226]Muddy Fields(二分图最小点覆盖)

    题目:http://poj.org/problem?id=2226 题意:给你一个字符矩阵,每个位置只能有"*"或者“.",连续的横着或者竖的“*"可以用一块木 ...

  4. 团队项目作业第二项:利用NABCD模型进行竞争性需求分析

    项目需求分析与建议--NABCD模型(王鲁跃负责) N (Need 需求) 对于现在的学生来说,我们认为打字是很重要的.不管在什么方面都需要进行电脑打字,例如文员.QQ.MSN.制作,论文等等,都需要 ...

  5. OC基础--分类(category) 和 协议(protocol)

    OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...

  6. HTML5的拖拽时间 ondragstart

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. NS图绘制工具推荐

    世界上要画NS图的人肯定很少,这种无聊的东西= = 我根据个人经验和直觉,推荐三个套工具. 一.签字笔(铅笔+橡皮)+作业纸+拍照的手机 鉴于我以前手绘版ns图已经找不到了,就用室友之前画的做个例子. ...

  8. 【POJ 1260】Pearls

    题 题意 有n个(n≤100)等级的珍珠,等级越高单价越高,要购买一种等级的珍珠就要多付10*单价,现在需要购买一些等级的珍珠一定数量,若买更高等级的珍珠更便宜则可以买更高等级的珍珠,求最少花费. 分 ...

  9. poj 1743 二分答案+后缀数组 求不重叠的最长重复子串

    题意:给出一串序列,求最长的theme长度 (theme:完全重叠的子序列,如1 2 3和1 2 3  or  子序列中每个元素对应的差相等,如1 2 3和7 8 9) 要是没有差相等这个条件那就好办 ...

  10. 轻量级应用开发之(10) UINavigationController导航控制器

    一 多控制器 1)一个iOS的app很少只由一个控制器组成,除非这个app极其简单2)当app中有多个控制器的时候,我们就需要对这些控制器进行管理3)有多个view时,可以用一个大的view去管理1个 ...