最小費用最大網路流

2021-10-09 11:39:03 字數 1384 閱讀 3490

要打網路賽了,抓緊時間複習。

這裡我先介紹一下費用流全名:最小費用最大網路流。所以我先介紹最大網路流。

就是給定乙個圖,每一條邊都有乙個上限,表示這條邊的最大流量,求從源點流到匯點的最大流量。

對於這種題目,我們一般採用dinic演算法(複雜度n2∗

mn^2*m

n2∗m

).對於dinic演算法,每次增廣前,我們先用 bfs 來將圖分層。設源點的層數為 0 ,那麼乙個點的層數便是它離源點的最近距離。

分層:確定每乙個點的層數,那麼只要每一次都走到下一層,則在尋找增廣路時保證搜尋深度最小。

確定是否還存在有增廣路。

對於反向邊,我們每一次選擇一條增廣路之後都要建立一條反向邊,因為你所選的這條邊不一定是最優的,那麼你就可能要返回,所以建立反向邊來解決最優問題。

多路增廣 :每次找到一條增廣路的時候,如果殘餘流量沒有用完怎麼辦呢?我們可以利用殘餘部分流量,再找出一條增廣路。這樣就可以在一次 dfs 中找出多條增廣路,大大提高了演算法的效率。

在最大網路流的圖裡面再加上乙個單位費用,求花費最小的最大網路流。

這裡我只介紹類dinic演算法。

對於這個類dinic演算法和dinic演算法有啥區別呢?

關於dinic演算法,我們是使用bfs來做的分層,而在類dinic演算法裡面我們採用spfa來判斷增廣路,同時沒有分層。

在尋找增廣路時,按照spfa形成的最短路去找增廣路,只要能找到增廣路,那麼就可以放到最小費用流裡面去。

板子題

#include#include#include#include#include#include#includeusing namespace std;

#define rep(a,b,c) for(int a = (b) ;a<=(c);a++)

typedef long long ll;

const int n = 2e5+7;

const int inf = 0x3f3f3f3f;

struct eded[n];

int dis[n],vis[n],lin[n],ret,tot,head[n];

void add(int u,int v,int w,int f)

void init()

bool spfa(int s,int t)}}

return dis[t]!=inf;

}int dfs(int u,int t,int flow)

}vis[u] = 0;

return ans;

}void mcmf(int s,int t)

printf("%d %d\n",ans,ret);

}int main()

mcmf(s,t);

//system("pause");

}

最大網路流

求網路流有很多演算法,這幾天學習了兩種,記錄一下ek演算法。首先是網路流中的一些定義 v表示整個圖中的所有結點的集合.e表示整個圖中所有邊的集合.g v,e 表示整個圖.s表示網路的源點,t表示網路的匯點.對於每條邊 u,v 有乙個容量c u,v c u,v 0 如果c u,v 0,則表示 u,v ...

最大網路流

1 基本概念和術語 1 網路 g 是乙個簡單有向圖,g v,e v 在 v 中指定乙個頂點 s 稱為源 和另乙個頂點 t 稱為匯 有向圖 g 的每一條邊 v,w e 對應有乙個值 cap v,w 0 稱為邊的容量 這樣的有向圖 g 稱作乙個網路 2 網路流 網路上的流 是定義在網路的邊集合 e 上的...

最大網路流

圖中有兩個點源結點s和匯點t。源結點是網路流的起點,匯點是流的終點 給定乙個流網路g 乙個源結點s 乙個匯點t,找到值最大的乙個流 定義 出發點為源點,接受流量 的匯聚點為匯點,邊上的權值為可以流過的最大值 殘存網路gf 由仍可以對流量進行增加 減少的邊構成 流過的量不超過容量的邊 包含原圖中的邊,...