1. 程式人生 > >【BZOJ2055】80人環遊世界(有源匯有上下界最小費用最大流)

【BZOJ2055】80人環遊世界(有源匯有上下界最小費用最大流)

Description

Solution

ss連流量上界為m、下界為0、費用為0的邊。
每個點拆成兩個點,其中一個向另一個連邊,上界下界都為Vi,費用為0
s向每個入點連邊,每個出點向t連邊。
點與點之間如果通航,則從一個連向另一個點。
然後跑有源匯有上下界最小費用最大流即可。

調了好久,發現是dis沒有全部賦為+ QAQ

Code

/**************************************
 * Au: Hany01
 * Prob: [BZOJ2055] 80人環遊世界
 * Date: Jul 19th, 2018
 * Email: 
[email protected]
**************************************/
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef vector<int> VI; #define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout) #define rep(i, j) for (register int i = 0, i##_end_ = j; i < i##_end_; ++ i)
#define For(i, j ,k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i) #define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i) #define Set(a, b) memset(a, b, sizeof(a)) #define Cpy(a, b) memcpy(a, b, sizeof(a)) #define SZ(a) ((int)(a.size())) #define ALL(a) a.begin(), a.end()
#define pb(a) push_back(a) #define mp(a, b) make_pair(a, b) #define INF (0x3f3f3f3f) #define INF1 (2139062143) #define y1 wozenmezhemecaia #ifdef hany01 #define debug(...) fprintf(stderr, __VA_ARGS__) #else #define debug(...) #endif template<typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; } template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; } inline int read() { register char c_; register int _, __; for (_ = 0, __ = 1, c_ = getchar(); !isdigit(c_); c_ = getchar()) if (c_ == '-') __ = -1; for ( ; isdigit(c_); c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48); return _ * __; } const int maxn = 207, maxm = maxn * maxn * 6; int n, m, s, t, S, T, beg[maxn], v[maxm], nex[maxm], f[maxm], w[maxm], e = 1, dis[maxn], vis[maxn], Flow, Cost, s1; inline void add(int uu, int vv, int ff, int ww, int fl = 1) { v[++ e] = vv, w[e] = ww, f[e] = ff, nex[e] = beg[uu], beg[uu] = e; if (fl) add(vv, uu, 0, -ww, 0); } /*inline void Add(int u, int v, int f1, int f2, int w) { add(S, v, f1, w), add(u, T, f1, 0); if (f2 > f1) add(u, v, f2 - f1, w); }*/ inline bool BFS() { static queue<int> q; Set(dis, 127); Set(vis, 0), dis[S] = 0, q.push(S); while (!q.empty()) { int u = q.front(); q.pop(), vis[u] = 0; for (register int i = beg[u]; i; i = nex[i]) if (f[i] && chkmin(dis[v[i]], dis[u] + w[i])) if (!vis[v[i]]) vis[v[i]] = 1, q.push(v[i]); } return dis[T] != 0x7f7f7f7f; } int DFS(int u, int flow) { if (u == T) return flow; int t, res = flow; vis[u] = 1; for (register int i = beg[u]; i; i = nex[i]) if (f[i] && dis[v[i]] == dis[u] + w[i] && !vis[v[i]]) { f[i] -= (t = DFS(v[i], min(res, f[i]))), f[i ^ 1] += t, Cost += t * w[i]; if (!(res -= t)) return flow; } return flow - res; } int main() { #ifdef hany01 File("bzoj2055"); #endif static int tmp; n = read(), m = read(), s1 = (T = (S = (t = (n << 1) + 1) + 1) + 1) + 1; add(s, s1, m, 0); For(i, 1, n) tmp = read(), add(S, i + n, tmp, 0), add(i, T, tmp, 0), add(s1, i, m, 0), add(i + n, t, m, 0); For(i, 1, n - 1) For(j, i + 1, n) if ((tmp = read()) != -1) add(i + n, j, m, tmp); add(t, s, INF, 0); while (BFS()) Flow += DFS(S, INF); printf("%d\n", Cost); return 0; }

相關推薦

BZOJ205580環遊世界上下費用

Description Solution 從ss向s′s′連流量上界為mm、下界為00、費用為00的邊。 每個點拆成兩個點,其中一個向另一個連邊,上界下界都為ViVi,費用為00。 從s

BZOJ205580環遊世界上下費用

隨便建... /* Think Thank Thunk */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

bzoj205580環遊世界 上下費用

對有上下界的網路流理解的還不夠。 有上下界的網路流 其實是無源無匯的有上下界的最小費用最大流(好像是吧?無源無匯是什麼意思來著?) 每個人可以從任意一個點出發,每個點正好v個人 超級源點S,超級匯點T

ACM-ICPC 2018 瀋陽賽區網路預賽 F題 Fantastic Graph 上下可行

題意 給你兩個集合X,Y,X集合有N個點,Y集合有M個點,輸入一個上下界down,up,現在有K條邊,輸入K條邊(u,v)。每選擇一條邊(u,v),u和v點的權值就+1,問能否通過選擇一些邊(每條邊只能選一次)使得所有點的權值都在[down,up]之間。 思路 有源匯的

[bzoj2055] 80環遊世界

時間 spf head 表示 bits cap 吸引力 沒有 isp Description 想必大家都看過成龍大哥的《 \(80\) 天環遊世界》,裏面的緊張刺激的打鬥場面一定給你留下了深刻的印象。現在就有這麽 一個 \(80\) 人的團夥,也想來一次環遊世界。 他們打算

bzoj 2055: 80環遊世界 -- 上下網絡

沒有 bzoj 一個 stream 完成 esp namespace gree clas 2055: 80人環遊世界 Time Limit: 10 Sec Memory Limit: 64 MB Description 想必大家都看過成龍

BZOJ 2055: 80環遊世界(上下費用)

題面 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 693 Solved: 434 [Submit][Status][Discuss] Description 想必大家都看過成龍大哥的《80天環遊世界》,裡面的緊張刺激的打鬥場面一定給你留下了深刻的印象。現在就

洛谷P4553 80環遊世界

題目描述 https://www.luogu.org/problemnew/show/P4553 題解 思路比較顯然,把圖建出來,一個國家拆成兩個點,中間設定上下界,然後跑費用流。 我把源那邊的流量也設定了上下界,但是題解沒有,為什麼我按照題解的建圖方法會WA? 程式碼 #include&l

網絡24題餐巾計劃問題費用

open pre ++i 需求 http += cst efi pty 【網絡流24題】餐巾計劃問題(最小費用最大流) 題面 COGS 洛谷上的數據範圍更大,而且要開longlong 題解 餐巾的來源分為兩種: ①新買的 ②舊的拿去洗 所以,兩種情況分別建圖 先考慮第一種

洛谷 P3381費用SPFA+EK

在最大流的基礎上把BFS換成SPFA即可。 #include<bits/stdc++.h> using namespace std; const int maxn = 100050; const int INF = 0x3f3f3f3f; int head[maxn]; bo

SPOJ - SCITIESSelfish Cities費用

Far, far away there is a world known as Selfishland because of the nature of its inhabitants. Hard times have forced the cities of Selfishland to ex

POJ - 2135Farm Tour費用

When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000) fields numbered 1..N, the first o

網路24題餐巾計劃費用

題意 一個餐廳在相繼的 nnn 天裡,每天需用的餐巾數不盡相同。假設第 iii 天需要 rir_iri​​​ 塊餐巾。餐廳可以購買新的餐巾,每塊餐巾的費用為 PPP 分;或者把舊餐巾送到快洗部,洗一塊需 MMM天,其費用為 FFF 分;或者送到慢洗部,洗一塊需

網路24題運輸問題費用

題意 W 公司有 mmm 個倉庫和 nnn 個零售商店。第 iii 個倉庫有 aia_iai​​​ 個單位的貨物;第 jjj 個零售商店需要 bjb_jbj​​​ 個單位的貨物。貨物供需平衡,即∑i=1mai=∑j=1nbj​​\sum\limits_{i =

網路24題 No.10 餐巾計劃問題 線性規劃網路優化 費用

【題意】   一個餐廳在相繼的 N 天裡, 每天需用的餐巾數不盡相同。 假設第 i 天需要 ri 塊餐巾(i=1,2,…, N)。 餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分;或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f分;或者送到慢洗部, 洗一塊需 n 天(n>m),其費用為 s<

洛谷4016 負載平衡問題網絡24題,費用

eof out map set graph pre etc ret freopen 前言 網絡流24題還是要寫一下。 Solution 我們先來研究一下這個題目是個什麽東西: 每一個點有可能比平均數多,也有可能少,然後你就發現相當於是我們建了兩個超級源點和超級匯點,然後從這

洛谷4016 負載平衡問題網路24題,費用

前言 網路流24題還是要寫一下。 Solution 我們先來研究一下這個題目是個什麼東西: 每一個點有可能比平均數多,也有可能少,然後你就發現相當於是我們建了兩個超級源點和超級匯點,然後從這兩個點去分和流入。 然後對於這個環就可以直接建環(注意建邊的時候的一些細節操作) 跑一邊費用流就好了。 #inc

網路費用模板

#include <bits/stdc++.h> using namespace std; const int Max=50010; const int inf=1e9; int n,m,ans1,ans2,size=1,head,tail,s,t; int f

模板費用增廣路模板題:洛谷P3381

題目描述 如題,給出一個網路圖,以及其源點和匯點,每條邊已知其最大流量和單位流量費用,求出其網路最大流和在最大流情況下的最小費用。 輸入輸出格式 輸入格式: 第一行包含四個正整數N、M、S、T,分別表示點的個數、有向邊的個數、源點序號、匯點序號。 接下來M行每行包

2017 ACM-ICPC 亞洲區烏魯木齊賽區網路賽 J.Our Journey of Dalian Ends費用

Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpected places and unexpected people. Now our journey of Dal