網路最大流演算法—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 &