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
int m=100005;12
const
int inf=599518803;13
14int
n,m,s,t;
15int
num_edge,head[n];
16int
val[n],pre[n];
17struct
edge
18edge[m<<1
];21
22int
read()
2330
31void add_edge(int u,int v,int
w)32
3940
bool
bfs()
4161
if(val[t])//
迴圈到了t就跳出迴圈
62break;63
}64}65
return
val[t];66}
6768
intmain()
6978
int ans=0;79
while
(bfs())
8086 ans+=val[t];87}
88 printf("
%lld
",ans);
89return0;
90 }
dinic詳解blog:
//dinic
//快忘乾淨了
//寫一下自己能想起來的地
//改了幾遍,差不多可以想起來了,而且也明白了一些以前沒明白的地方
//emmm,在改進**中加強對**的理解程度吧算是
//開了氧氣之後可以跑到72ms啦!
//要一開始讓num_edge=1,感覺可能會因為忘寫翻車
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int n=1e4+5
;const
int m=1e5+5
;int
n,m,s,t;
int head[n],from
[n],num_edge;
intdep[n];
struct
edge
edge[m
<<1
];inline
intread()
inline
void add_edge(int u,int v,int
w)inline
bool
bfs()}}
return0;
}int dfs(int now,int
flow)
dep[now]=0; //
能從for迴圈裡出來而沒有提前return說明這個點所連出去的邊流量全都流完了(全都滿流),所以把這個點的dep設成0,他已經沒有貢獻了
return
outflow;
}int
main()
int ans=0
;
while
(bfs())
ans+=dfs(s,0x7fffffff
); printf("%d
",ans);
return0;
}
P3376 模板 網路最大流
網路流用於解決流量問題 網路流 所有弧上流量的集合f 稱為該容量網路的乙個網路流。1 定義 帶權的有向圖g v,e 滿足以下條件,則稱為網路流圖 flow network 僅有乙個入度為0的頂點s,稱s為源點。僅有乙個出度為0的頂點t,稱t為匯點。每條邊的權值都為非負數,稱為該邊的容量,記作c i,...
P3376 模板 網路最大流
如題,給出乙個網路圖,以及其源點和匯點,求出其網路最大流。輸入格式 第一行包含四個正整數n m s t,分別表示點的個數 有向邊的個數 源點序號 匯點序號。接下來m行每行包含三個正整數ui vi wi,表示第i條有向邊從ui出發,到達vi,邊權為wi 即該邊最大流量為wi 輸出格式 一行,包含乙個正...
P3376 模板 網路最大流
luogu p3376 求網路最大流.首先介紹一下網路流的基本概念.乙個帶權有向圖,邊權稱為容量.其中乙個只有出度的點,源點,乙個只有入度的點,匯點.流從源點源源不斷地產生,在匯點消失.邊的容量就是能它流過的最大流,實際流過的流成為邊的流量.源點流出的最大的流一定和匯點消失的最大的流相等,我們把這個...