有上下界的網路流

2021-07-11 03:08:18 字數 1773 閱讀 4330

1、無源匯有上下界可行流

構圖方法: 對於每條邊有乙個上界容量up和乙個下界容量low,我們讓這條邊的容量下界變為0,上界為up-low。可是這樣做了的話流量就不守恆了,為了再次滿足流量守恆,即每個節點」入流=出流」,我們增設乙個超級源點st和乙個超級終點sd。我們開設乙個陣列du來記錄每個節點的流量情況。

du[i]=in[i](i節點所有入流下界之和)-out[i](i節點所有出流下界之和)。

當du[i]大於0的時候,st到i連一條流量為du[i]的邊。

當du[i]小於0的時候,i到sd連一條流量為-du[i]的邊。

最後對(st,sd)求一次最大流即可,當所有附加邊全部滿流時(即maxflow==所有du>0之和),有可行解。

#include "stdafx.h"

#include

#include

#include

using

namespace

std;

const

int max_v = 10000;

const

int inf = 1

<< 30;

int n, m;

int w[max_v];

struct edge;

vector

g[max_v];

int level[max_v]; //圖的層次標記

int iter[max_v]; //用於弧優化的當前弧

void add_edge(int from, int to, int cap)

; edge e2 = ;

g[from].push_back(e1);

g[to].push_back(e2);

}//通過bfs計算圖的層次

void bfs(int s)}}

}//通過dfs尋找增廣路

int dfs(int v, int t, int f)}}

return0;}

int dinic(int s, int t)

}}int _tmain(int argc, _tchar* argv)

for (int i = 1; i <= n; i++)

if (w[i] < 0)

add_edge(i, t, -w[i]);//從每個流入下界流總和小於0(即流出下界流)的點向超級匯連一條通路,容量為下界流總和的相反數

}int f = dinic(s, t);

if (f == sumlow) //求得的最大流等於從超級源流出的下界流,則這個最大流就是所要求的解,否則問題無可行解。

printf_s("%dyes\n",f);

else

printf_s("%dno\n",f);

return

0;}

2、有源匯有上下界最大流

在無源匯有上下界最大流的構圖基礎上,從超級源st向源點s連線一條容量為inf的邊,從匯點t向超級匯sd連線一條容量為inf的邊。求從st到sd的最大流f』(注意,這裡也要像1一樣檢驗f』是否是可行解,如果f』沒有可行解原問題也沒有可行解),則原圖的f=f』-所有su>0之和。

3、有源匯有上下界最小流

設原來的源匯為s, t, 附加源匯為s, t,

先像1那樣構圖,然後使用二分法判斷最小流。

假設二分的流量是x,則新增邊(t, s) 上界為x,下界為0的邊,

然後按1中的方法求x是否是新圖的無源匯可行流。

最後求得的最小的該x即為最終原圖中的最小流。

有上下界網路流

前言 下面寫得只是一些十分基礎的東西,是給我以後自己看的,想要徹底弄明白這個內容,推薦去看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。可是這樣做了的話流量就不守恆了,為了再次滿足流量守恆,即...