初學網路流。存一下dinic板子。
複雜度o(n^2*m)
uva - 1515 pool construction
把每個草地與 s 相連,花費為dig,每個洞與 t 相連,花費為
然後對於每個兩個相鄰的點連一條權值為 build 的邊。
求最小割,就是把草和洞分開的花費。
因為只有三種割的情況:
割s與草之間的邊,那麼這個草就與t相連了。所以花費需要dig。
割t與洞之間的邊。同理。
割兩個相鄰的點之間的邊。很顯然,如果他們連著同乙個點(源點或者匯點),那麼他們是不會被割開的。
所以只有他們連著不同的點的時候,才會需要花費build割開。
#include #includeview code#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;
}
模板題:codevs 1993 草地排水
#include #includehdu - 5889 barricade#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;
}
先跑一遍最短路,然後從最短路上的邊中跑最小割。
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 ...