1. 程式人生 > >網路最大流演算法—EK演算法

網路最大流演算法—EK演算法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int MAXN=2*1e6+10;
const int INF=1e8+10;
inline char nc()
{
    static char buf[MAXN],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1
,MAXN,stdin),p1==p2)?EOF:*p1++; } inline int read() { char c=nc();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();} return x*f; } struct node { int u,v,flow,nxt; }edge[MAXN]; int head[MAXN]; int num=0;//
注意這裡num必須從0開始 inline void add_edge(int x,int y,int z) { edge[num].u=x; edge[num].v=y; edge[num].flow=z; edge[num].nxt=head[x]; head[x]=num++; } inline void AddEdge(int x,int y,int z) { add_edge(x,y,z); add_edge(y,x,0);//注意這裡別忘了加反向邊 } int N,M,S,T; int path[MAXN];//
經過的路徑 int A[MAXN];//S到該節點的最小流量 inline int EK() { int ans=0;//最大流 while(true)//不停的找增廣路 { memset(A,0,sizeof(A)); queue<int>q;//懶得手寫隊列了。。。 q.push(S); A[S]=INF; while(q.size()!=0) { int p=q.front();q.pop(); for(int i=head[p];i!=-1;i=edge[i].nxt) { if(!A[edge[i].v]&&edge[i].flow) { path[ edge[i].v ]=i;//記錄下經過的路徑,方便後期增廣 A[edge[i].v]=min(A[p],edge[i].flow);//記錄下最小流量 q.push(edge[i].v); } } if(A[T]) break;//一個小優化 } if(!A[T]) break;//沒有可以增廣的路徑,直接退出 for(int i=T;i!=S;i=edge[path[i]].u)//倒著回去增廣 { edge[path[i]].flow-=A[T]; edge[path[i]^1].flow+=A[T];//利用異或運算子尋找反向邊,0^1=1 1^1=0 } ans+=A[T]; } return ans; } int main() { #ifdef WIN32 freopen("a.in","r",stdin); #else #endif memset(head,-1,sizeof(head)); N=read(),M=read(),S=read(),T=read(); for(int i=1;i<=M;i++) { int x=read(),y=read(),z=read(); AddEdge(x,y,z); } printf("%d", EK() ); return 0; }

相關推薦

HDU 3549 Flow Problem 網路問題 EK、Dinic、ISAP三種演算法

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 8218    Accepted

ek演算法】HDU1532 求

本來是繼續加強最短路的訓練,但是遇到了一個最短路 + 最大流的問題,最大流什麼鬼,昨天+今天學習了一下,應該對ek演算法有所瞭解,憑藉學習後的印象,自己完成並ac了這個最大流的模板題題目大意:都是圖論,只是這個圖給你的關係是網路關係,就是從s到t的路上,你運送的東西的量必

【圖論】EK演算法與Dinic演算法小費用

最大流: 給出一張網路圖,並指定源點和終點,每條邊都有它的容量,起點有著無限的流量,求從源點到經過的所有路徑的最終到達匯點的最大流量和。對於同一個節點,流入的流量之和和流出的流量之和相同,即假如結點1有12流量流入結點2,結點2分別有8流量流入結點3,4流量流入結點4,這種

網路演算法EK演算法

#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; const int

網路演算法之Ford_Fullkerson方法,EK演算法c++模板

該演算法最精華的部分是反向邊的理解, 即修改容量的時候為什麼反向邊加上該值,     c[pre[i]][i]-=_min;     c[i][pre[i]]+=_min;              在演算法導論中對求解最大流問題給出了一般性的解決方法,但並沒有涉

網路(Dinic演算法

程式碼對應於 POJ - 3281 #include <iostream> #include <cstring> #include <cstdio> #include <queue> #define fuck

網路-ISAP演算法詳解與模板

ISAP演算法 ISAP(Improved Shortest Augumenting Path)演算法是改進版的SAP演算法,如果對效率要求很高的時候,可以用該演算法。 (1)概述:演算法基於這樣的一個事實:每次增廣之後,任意結點到匯點(在殘餘網路中)的最短距離都不會

經典的題POJ1273(網路裸題) 【之Dinic演算法】POJ1273 【 & 當前弧優化 & 】

http://poj.org/problem?id=1273   Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K

網路 - 從入門開始,詳細講到實用易懂的 Dinic 演算法

2019-01-02 更新 理解網路 一張網路,是一張帶權有向圖。比喻成輸水系統可能好理解—— 源頭是大水庫,想輸出多少就輸出多少。 但是,想要輸出到目的地,需要經過中轉點。中轉點不產生新流量、也不私吞;接受多少流量,就同時輸出多少流量。 點與點之間管道的容量(可以理解為水流量限制;注意“流量”指單

網路演算法—最高標號預推進HLPP

#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; const int

網路的sap()演算法

         現在想將一些物資從S運抵T,必須經過一些中轉站。連線中轉站的是公路,每條公路都有最大運載量。          每條弧代表一條公路,弧上的數表示該公路的最大運載量。最多能將多少貨物從S運抵T?                   這是一個典型的網路流模

網路中一般增廣路演算法(標號法)

網路最大流主要有兩大類求解方法:增廣路演算法和預流推進演算法 一般增廣路演算法:主要分為初始流為零流和初始流為非零流的情況!後者在標號的時候注意一條邊是正向連線還是反向連線;若是反向的連線,那麼在調整的時候是減去,若為正向那麼在調整的時候是加上!   這裡就poj1149

網路相關】的Dinic演算法實現

Luogu P3376 於\(EK\)演算法求最大流時每一次只求一條增廣路,時間複雜度會比較高。儘管實際應用中表現比較優秀,但是有一些題目還是無法通過。 那麼我們就會使用\(Dinic\)演算法實現多路增廣。 演算法的基本流程如下: \(BFS\)對圖進行分層,求出終點所在的層數 \(DFS\)對每一條增廣

網路 Dinic演算法

# 前言 看到網上好多都用的鏈式前向星,就我在用 $vector$ 鄰接表…… # 定義 先來介紹一些相關的定義。(個人理解) ## 網路 一個網路是一張帶權的有向圖 $G=(V,E)$ ,其中每任意一條邊 $(u,v)$ 的權值稱為這條邊的容量 $c(u,v)$ 。若這條邊不存在,對應的容量就為 $0$ 。

POJ3281 Dining 入門 Dinic演算法

**題意: ** 有N頭牛,F種食物可以製作,D種飲料可以製作 然後每行代表一頭牛的喜好,開頭兩個數fi,di表示這頭牛喜歡fi種食物,di種飲料,接下來fi個數表示喜歡的食物編號,di個數表示喜歡的飲料的編號 現在主人使用最優決策製作出F種食物和D種飲料,問

演算法導論—(Edmonds-Karp演算法)

華電北風吹 天津大學認知計算與應用重點實驗室 2016-07-20 有向圖的最大流演算法程式碼模板。利用廣度優先搜尋尋找殘量網路增廣路。 參考程式碼: #include <iostr

的基本演算法(ff演算法&&dinic演算法&&push-rebeal演算法)poj1273

最大流的基本概念有以下幾點:               1.殘存網路:即為一條管道被佔用了一部分流量之後所剩下的流量。在網路流中,圖被看為一個有向圖,殘存流量向量相加後永遠不變。這一點有點像基爾霍夫定律。               2.在找到一個流之後,仍然存在的從源點

poj 1459 Power Network 初級->圖演算法->(基本演算法:增廣路)

Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 19197 Accepted: 10125 Description A power network consists of nodes (pow

Ford-Fulkerson演算法模板

#include <bits/stdc++.h> using namespace std; const int maxn=250; const int inf=INT_MAX; st

之EdmondsKarp演算法】【HDU1532】模板題

題意:裸的最大流,什麼是最大流,參考別的部落格 運用複雜度最高的EK演算法 O(M*N),模板來自紫書 #include <cstdio> #include <cstdlib> #include <cmath> #include &