有上下界的流

2021-07-15 06:01:10 字數 1470 閱讀 1547

acm模版

/*

* 有上下界的最小(最大)流

* init: up為容量上界; low為容量下界;

* call: mf = limitflow(n,src,sink); flow為流量分配;

* 另附: 迴圈流問題

* 描述: 無源無匯的網路n,設n是具有基礎有向圖d=(v,a)的網路.

* l和c分別為容量下界和容量上界. 如果定義在a上的函式

* f滿足: f(v, v) = f(v, v). v中任意頂點v,

* l(a)<=f(a)<=c(a),則稱f為網路n的迴圈流.

* 解法: 新增乙個源s和匯t,對於每個下限容量l不為0的邊(u, v),

* 將其下限去掉,上限改為c-l,增加兩條邊(u, t),(s, v),

* 容量均為l.原網路存在迴圈流等價於新網路最大流是滿流.

*/const int inf = 0x3f3f3f3f;

const int n = 1010;

int up[n][n], low[n][n], flow[n][n];

int pv[n], que[n], d[n];

void maxflow(int n, int src, int sink)

else

if (!pv[i] && up[i][t] && (j = flow[i][t]) > 0)}}

for (i = sink; pv[i] && i != src;)

else}}

while (pv[sink]);

return ;

}int limitflow(int n, int src, int sink)

up[n][n + 1] = up[n + 1][n] = up[n][n] = up[n + 1][n + 1] = 0;

for (i = 0; i < n; i++)

}sk = up[src][sink];

ks = up[sink][src];

up[src][sink] = up[sink][src] = inf;

maxflow(n + 2, n, n + 1);

for (i = 0; i < n; i++)

}flow[src][sink] = flow[sink][src] = 0;

up[src][sink] = sk;

up[sink][src] = ks; // !min:src<-sink; max:src->sink;

maxflow(n, sink, src);

for (i = 0; i < n; i++)

}for (j = i = 0; i < n; j += flow[src][i++]);

return j;

}

有上下界網路流

前言 下面寫得只是一些十分基礎的東西,是給我以後自己看的,想要徹底弄明白這個內容,推薦去看liu runda。注 為了方便,下面所有的 x,y,l,r 都表示一條從x連向y,流量下界為l,流量上界為r的邊。問題簡述 給出乙個有向圖,每條邊有流量上下界,沒有源點和匯點,要求找到一種流的方法,使得每個點...

有上下界的網路流

有上下界的網路流 這幾天看了周源的 一種簡易的方法求解流量有上下界的網路中網路流問題 並完成了 sgu 194 zoj 2314 reactor cooling,sgu 176 flow construction 和hoj 2135 poj 2396 budget三道題。作為周源文章中提到的求解上下...

有上下界的網路流

1.無匯源有上下界最大流 以前寫的最大流預設的下界為0,而這裡的下界卻不為0,所以我們要進行再構造讓每條邊的下界為0,這樣做是為了方便處理。對於每根管子有乙個上界容量up和乙個下界容量low,我們讓這根管子的容量下界變為0,上界為up low。可是這樣做了的話流量就不守恆了,為了再次滿足流量守恆,即...