網路流之Dinic演算法

2022-05-11 15:15:22 字數 3437 閱讀 8172

初學網路流。存一下dinic板子。

複雜度o(n^2*m)

uva - 1515 pool construction 

把每個草地與 s 相連,花費為dig,每個洞與 t 相連,花費為

然後對於每個兩個相鄰的點連一條權值為 build 的邊。

求最小割,就是把草和洞分開的花費。

因為只有三種割的情況:

割s與草之間的邊,那麼這個草就與t相連了。所以花費需要dig。

割t與洞之間的邊。同理。

割兩個相鄰的點之間的邊。很顯然,如果他們連著同乙個點(源點或者匯點),那麼他們是不會被割開的。

所以只有他們連著不同的點的時候,才會需要花費build割開。

#include #include 

#include

#include

#include

using

namespace

std;

const

int n = 55

;const

int maxn = n*n+2+100

;const

int maxm = maxn*4*2

;const

int inf=0x3f3f3f3f

;int

g[n][n];

intn,m,dig,fil,bui;

ints, t;

int ans = 0

;struct

dinic

void add_edge(int a,int b,int

c)

bool

bfs()}}

return

vis[t];

}int dfs(int x,int

a) }

return

flow;

}int maxflow(int s,int

t)

return

flow;

}}dinic;

inline

int id(int x, int

y)int

main()

int dx = , dy = ;

for (int i = 1; i <= n; i++)

for (int j = 1; j <= m; j++)

else

if(g[i][j]) dinic.add_edge(s, id(i, j), dig);

else

dinic.add_edge(id(i, j), t, fil);

for (int k = 0; k < 4; k++)

}ans +=dinic.maxflow(s, t);

printf(

"%d\n

", ans);

}return0;

}

view code

模板題:codevs 1993 草地排水

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn=100000+10

;const

int inf=2147000000

;struct

dinic

void add_edge(int a,int b,int

c) //

加雙向邊

bool

bfs()}}

return

vis[t];

}//求深度

int dfs(int x,int

a) }

return

flow;

}//增廣路

int maxflow(int ss,int

tt)

return

flow;

}}dinic;

intn,m;

intmain()

int ans = dinic.maxflow(1

, n);

cout

return0;

}

hdu - 5889  barricade

先跑一遍最短路,然後從最短路上的邊中跑最小割。

tle**。。。我也不知道為什麼會tle。以後再改。

#include #include 

#include

#include

#include

#define mms(k, x) memset(k, (x), sizeof(k))

using

namespace

std;

const

int maxn = 10000+10

;const

int maxm = 2*100000+10

;const

int inf = 0x3f3f3f3f

;struct

dinic

void add_edge(int a,int b,int

c) //

加雙向邊

bool

bfs()}}

return

vis[t];

}//求深度

int dfs(int x,int

a) }

return

flow;

}//增廣路

int maxflow(int ss,int

tt)

return

flow;

}}dinic;

intv[maxm], nxt[maxm], last[maxm], l[maxm], u[maxm];

intdis[maxn], vis[maxn];

int tot = 0

;void build(int x, int y, int

z)void

init()

int relax(int x, int y, int

tmp)

return0;

}void spfa(int

k) vis[x] = 0

; }

}int

n,m;

intmain()

spfa(1);

for (int i = 1; i <= tot; i+=2

)

int ans = dinic.maxflow(1

, n);

printf(

"%d\n

", ans);

}return0;

}

網路流dinic演算法

遇到過不少網路流的題目,直接找增廣路徑的方法時間複雜度實在受不了。常面臨tle的問題。通過學習這個dinic演算法,不僅 短,效率也高。該演算法的重點在於乙個層次圖,是在普通增廣的方法上加了優化,普通的增廣是每次在圖上四處遊蕩,直到找到匯點為止。dinic演算法就是把每個點都給乙個等級level l...

網路流Dinic演算法

我的模板 例題 struct edge edge int llst,int ffrom,int tto,int ccap,int fflow lst llst from from to tto cap ccap flow fflow dinic 演算法有3個重點 乙個是 層次圖 乙個是 阻塞流 乙個...

網路流 最大流之Dinic演算法

網路流主要解決三種問題 最大流 最小流和費用流。最大流演算法主要有三種 ek演算法 dinic演算法 sap演算法。本篇部落格是關於dinic演算法的。最壞的情況下,dinic演算法將達到複雜度o v e2 o v2e 1 include 2 include 3 include 4 include ...