有源匯有上下界最大 最小流

2022-05-22 19:57:09 字數 2432 閱讀 7382

建圖還是要想一想的...寫一下吧

首先根據有源匯可行流建圖,正向附加邊滿流證明有可行流

然後在這個殘量網路上刪掉 $(t,s,oo)$ 這條邊,跑 $s->t$ 最大流就是最大流,$t->s$ 最大流就是最小流

#include #define int long long

#define ll long long

#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)

#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)

using

namespace

std;

inline

intread()

const

int maxn = 500010

;struct

dinic

edge(

int _1, int _2, int _3) : from

(_1), to(_2), caps(_3) {}

} es[maxn];

void add(int u, int v, int

w) dinic()

queue

q;intdis[maxn];

intbfs() }}

return (dis[s] > 1

); }

int dfs(int u, int

a) }

return

flow;

}int maxflow(int _s, int

_t)

return

flow;

}} sol;

intind[maxn];

signed main() sol.n = n + 5

;

int totflow = 0

; rep(u,

1, n)

sol.add(t, s, oo);

int rflow =sol.maxflow(ss, tt);

if(totflow >rflow) sol.es[m - 1].caps = sol.es[m - 2].caps = 0

; cout

<< oo - sol.maxflow(t, s) <

}

最小流

#include #define int long long

#define ll long long

#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)

#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)

using

namespace

std;

inline

intread()

const

int maxn = 200010

;struct

dinic

edge(

int _1, int _2, int _3) : from

(_1), to(_2), caps(_3) {}

} es[maxn];

void add(int u, int v, int

w) dinic()

queue

q;intdis[maxn];

intbfs() }}

return (dis[s] > 1

); }

int dfs(int u, int

a) }

return

flow;

}int maxflow(int _s, int

_t)

return

flow;

}} sol;

intind[maxn];

signed main()

sol.n = n + 5

;

int totflow = 0

; rep(u,

1, n)

sol.add(t, s, oo);

int rflow =sol.maxflow(ss, tt);

if (totflow >rflow)

sol.es[m - 1].caps = sol.es[m - 2].caps = 0

; cout

<< sol.maxflow(s, t) <

}

最大流記住,刪邊的時候不是 $m$,是 $sol.m$

117 有源匯有上下界最小流

題目描述 n nn 個點,m mm 條邊,每條邊 e ee 有乙個流量下界 lower e text e lower e 和流量上界 upper e text e upper e 給定源點 s ss 與匯點 t tt,求源點到匯點的最小流。輸入格式 第一行兩個正整數 n nn m mm s ss t...

有源匯上下界最小流 模板

這只是 其中一種 做法 這只是其中一種做法 這只是其中一 種做法 我暫時還沒有理解,只是先放個模板而已 首 先還 是根據下 界來建圖 原圖源 點s,匯 點t 首先還是根據下界來建圖,原圖源點s,匯點t 首先還是根據 下界來建 圖,原圖 源點s,匯點t 然 後因 為流量守 恆,新建 超級源s 1和超級...

LOJ 117 有源匯有上下界最小流

我們看到有源點和匯點的上下界最小流,即在可行流的基礎上要求流量最小。我們先跑一遍可行流,設可行流為flow1flow1flow1 則最小流為可行流 還能向下浮動的流量flow2flow2flow2 其實我們可以發現還能向下浮動的流量就是從原圖匯點到原圖源點的最大流 感性理解 因此步驟為 跑出乙個有源...