[BZOJ1163][BZOJ1339][Baltic2008]Mafia
[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
输入示例
输出示例
数据规模及约定
见“输入”
题解
一个点拆成一个“入点”A 和“出点”B,A → B 连一条容量为权值的有向边,无向边拆分成两个有向边,跑一边最小割。
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <stack>
- #include <vector>
- #include <queue>
- #include <cstring>
- #include <string>
- #include <map>
- #include <set>
- using namespace std;
- const int BufferSize = 1 << 16;
- char buffer[BufferSize], *Head, *tail;
- inline char Getchar() {
- if(Head == tail) {
- int l = fread(buffer, 1, BufferSize, stdin);
- tail = (Head = buffer) + l;
- }
- return *Head++;
- }
- int read() {
- int x = 0, f = 1; char c = Getchar();
- while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
- while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
- return x * f;
- }
- #define maxn 410
- #define maxm 80410
- #define oo 2147483647
- struct Edge { int from, to, flow; } ;
- struct Dinic {
- int n, m, s, t, head[maxn], next[maxm];
- Edge es[maxm];
- int vis[maxn], Q[maxn], hd, tl;
- int cur[maxn];
- void init(int nn) {
- n = nn; m = 0;
- memset(head, -1, sizeof(head));
- return ;
- }
- void AddEdge(int a, int b, int c) {
- es[m] = (Edge){ a, b, c }; next[m] = head[a]; head[a] = m++;
- es[m] = (Edge){ b, a, 0 }; next[m] = head[b]; head[b] = m++;
- return ;
- }
- bool BFS() {
- memset(vis, 0, sizeof(vis));
- vis[s] = 1;
- hd = tl = 0; Q[++tl] = s;
- while(hd < tl) {
- int u = Q[++hd];
- for(int i = head[u]; i != -1; i = next[i]) {
- Edge& e = es[i];
- if(e.flow && !vis[e.to]) {
- vis[e.to] = vis[u] + 1;
- Q[++tl] = e.to;
- }
- }
- }
- return vis[t] > 0;
- }
- int DFS(int u, int a) {
- if(u == t || !a) return a;
- int flow = 0, f;
- for(int& i = cur[u]; i != -1; i = next[i]) {
- Edge& e = es[i];
- if(vis[e.to] == vis[u] + 1 && (f = DFS(e.to, min(a, e.flow)))) {
- flow += f; a -= f;
- e.flow -= f; es[i^1].flow += f;
- if(!a) return flow;
- }
- }
- return flow;
- }
- int MinCut(int ss, int tt) {
- s = ss; t = tt;
- int flow = 0;
- while(BFS()) {
- for(int i = 1; i <= n; i++) cur[i] = head[i];
- flow += DFS(s, oo);
- }
- return flow;
- }
- } sol;
- int main() {
- int n = read(), m = read();
- sol.init(n << 1);
- int s = (read() << 1) - 1, t = read() << 1;
- for(int i = 1; i <= n; i++) sol.AddEdge((i << 1) - 1, i << 1, read());
- for(int i = 1; i <= m; i++) {
- int u = read(), v = read();
- sol.AddEdge(u << 1, (v << 1) - 1, oo);
- sol.AddEdge(v << 1, (u << 1) - 1, oo);
- }
- printf("%d\n", sol.MinCut(s, t));
- return 0;
- }
[BZOJ1163][BZOJ1339][Baltic2008]Mafia的更多相关文章
- BZOJ1163&BZOJ1339[Baltic2008]Mafia——最小割
题目描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警 方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标 ...
- bzoj1339[Baltic2008]Mafia*
bzoj1339[Baltic2008]Mafia 题意: 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控.对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得 ...
- [BZOJ1339] [Baltic2008] Mafia / 黑手党
Description 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价, 现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的 ...
- 1339 / 1163: [Baltic2008]Mafia
1163: [Baltic2008]Mafia Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 96 Solved: 60[Submit][Statu ...
- 1163: [Baltic2008]Mafia
1163: [Baltic2008]Mafia Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 123 Solved: 70[Submit][Stat ...
- 【bzoj1163/bzoj1339】[Baltic2008]Mafia 网络流最小割
题目描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标点 ...
- bzoj1339/1163:[Baltic2008]Mafia
传送门 最小割,割点,模板... 代码: #include<cstdio> #include<iostream> #include<algorithm> #incl ...
- [BZOJ1163&1339]Mafia
[Baltic2008]Mafia 题目 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后, ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- c#取得控制台应用程序根目录
1.取得控制台应用程序的根目录方法 方法1.Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径方法2.AppDomain.CurrentDomain.Bas ...
- Fluent NHibernate关系映射
1.好处:Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码 实现: (1).首先我 ...
- [USACO2005][POJ2226]Muddy Fields(二分图最小点覆盖)
题目:http://poj.org/problem?id=2226 题意:给你一个字符矩阵,每个位置只能有"*"或者“.",连续的横着或者竖的“*"可以用一块木 ...
- 团队项目作业第二项:利用NABCD模型进行竞争性需求分析
项目需求分析与建议--NABCD模型(王鲁跃负责) N (Need 需求) 对于现在的学生来说,我们认为打字是很重要的.不管在什么方面都需要进行电脑打字,例如文员.QQ.MSN.制作,论文等等,都需要 ...
- OC基础--分类(category) 和 协议(protocol)
OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...
- HTML5的拖拽时间 ondragstart
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- NS图绘制工具推荐
世界上要画NS图的人肯定很少,这种无聊的东西= = 我根据个人经验和直觉,推荐三个套工具. 一.签字笔(铅笔+橡皮)+作业纸+拍照的手机 鉴于我以前手绘版ns图已经找不到了,就用室友之前画的做个例子. ...
- 【POJ 1260】Pearls
题 题意 有n个(n≤100)等级的珍珠,等级越高单价越高,要购买一种等级的珍珠就要多付10*单价,现在需要购买一些等级的珍珠一定数量,若买更高等级的珍珠更便宜则可以买更高等级的珍珠,求最少花费. 分 ...
- poj 1743 二分答案+后缀数组 求不重叠的最长重复子串
题意:给出一串序列,求最长的theme长度 (theme:完全重叠的子序列,如1 2 3和1 2 3 or 子序列中每个元素对应的差相等,如1 2 3和7 8 9) 要是没有差相等这个条件那就好办 ...
- 轻量级应用开发之(10) UINavigationController导航控制器
一 多控制器 1)一个iOS的app很少只由一个控制器组成,除非这个app极其简单2)当app中有多个控制器的时候,我们就需要对这些控制器进行管理3)有多个view时,可以用一个大的view去管理1个 ...