P3376 模板 網路最大流

2022-08-19 05:39:11 字數 1722 閱讀 7231

如題,給出乙個網路圖,以及其源點和匯點,求出其網路最大流。

第一行包含四個正整數n、m、s、t,分別表示點的個數、有向邊的個數、源點序號、匯點序號。

接下來m行每行包含三個正整數ui、vi、wi,表示第i條有向邊從ui出發,到達vi,邊權為wi(即該邊最大流量為wi)

一行,包含乙個正整數,即為該網路的最大流。

輸入 #1

4 5 4 3

4 2 30

4 3 20

2 3 20

2 1 30

1 3 40

輸出 #1

50
時空限制:1000ms,128m

資料規模:

對於30%的資料:n<=10,m<=25

對於70%的資料:n<=200,m<=1000

對於100%的資料:n<=10000,m<=100000

樣例說明:

題目中存在3條路徑:

4-->2-->3,該路線可通過20的流量

4-->3,可通過20的流量

4-->2-->1-->3,可通過10的流量(邊4-->2之前已經耗費了20的流量)

故流量總計20+20+10=50。輸出50。

網路流模板題,再次試驗了基於鏈式前向星的帶有當前弧優化的dinic演算法

注意cnt開始取1,有效從2開始,這是為了配合以後的e[i^1]運算找到相反邊。

比如:2(10)->3(11)

如果是從1開始:1->0就不能找到相反邊(wa了好多次qwq)

#include #include #include #define inf 0x3f3f3f3f

#define max_n 200005

using namespace std;

int n,m;

int s,t;

int flag;

int max_flow = 0;

int head[max_n];

int cnt = 1;

struct edge

e[max_n<<1];

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

int instack[max_n];

int depth[max_n];

int cur[max_n];

int bfs()

depth[s] = 0;

queueque;

que.push(s);

instack[s] = 1;

while(!que.empty())}}

}if(depth[t]!=inf) return 1;

return 0;

}int dfs(int u,int low)

int used = 0;

for(int i = cur[u];i;i=e[i].nxt)}}

return used;

}int dinic()

}return max_flow;

}int main()

cout << dinic() << endl;

return 0;

}

就是這樣

P3376 模板 網路最大流

網路流用於解決流量問題 網路流 所有弧上流量的集合f 稱為該容量網路的乙個網路流。1 定義 帶權的有向圖g v,e 滿足以下條件,則稱為網路流圖 flow network 僅有乙個入度為0的頂點s,稱s為源點。僅有乙個出度為0的頂點t,稱t為匯點。每條邊的權值都為非負數,稱為該邊的容量,記作c i,...

P3376 模板 網路最大流

ek演算法 個人感覺沒有dinic好理解 1 edmonds karp演算法2 時間複雜度o n m m 3 include4 include5 include6 include7 include8 using namespace std 910 const int n 10005 11 const...

P3376 模板 網路最大流

如題,給出乙個網路圖,以及其源點和匯點,求出其網路最大流。輸入格式 第一行包含四個正整數n m s t,分別表示點的個數 有向邊的個數 源點序號 匯點序號。接下來m行每行包含三個正整數ui vi wi,表示第i條有向邊從ui出發,到達vi,邊權為wi 即該邊最大流量為wi 輸出格式 一行,包含乙個正...