【BZOJ2055】80人環遊世界(有源匯有上下界最小費用最大流)
Description
Solution
從向連流量上界為、下界為、費用為的邊。
每個點拆成兩個點,其中一個向另一個連邊,上界下界都為,費用為。
從向每個入點連邊,每個出點向連邊。
點與點之間如果通航,則從一個連向另一個點。
然後跑有源匯有上下界最小費用最大流即可。
調了好久,發現是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;
}
相關推薦
【BZOJ2055】80人環遊世界(有源匯有上下界最小費用最大流)
Description Solution 從ss向s′s′連流量上界為mm、下界為00、費用為00的邊。 每個點拆成兩個點,其中一個向另一個連邊,上界下界都為ViVi,費用為00。 從s
【BZOJ2055】80人環遊世界【有上下界的最小費用最大流】
隨便建... /* Think Thank Thunk */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const
【bzoj2055】80人環遊世界 有上下界的費用流
對有上下界的網路流理解的還不夠。 有上下界的網路流 其實是無源無匯的有上下界的最小費用最大流(好像是吧?無源無匯是什麼意思來著?) 每個人可以從任意一個點出發,每個點正好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 - SCITIES】Selfish 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 - 2135】Farm 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