日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dinic算法模板

發布時間:2024/9/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dinic算法模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

詳解:http://blog.csdn.net/wall_f/article/details/8207595

算法時間復雜度:O(E * V * V)

1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <vector> 5 using namespace std; 6 #define N 105 7 #define M 1010 8 #define INF 0x3f3f3f3f 9 10 struct Edge { 11 int u, v, cap; 12 Edge () {} 13 Edge (int u, int v, int cap) : u (u), v (v), cap (cap) {} 14 }edge[N*N]; 15 vector<int> G[N]; 16 int S, T, cur[N], dis[N], tot; 17 18 void Addedge(int u, int v, int cap) { 19 G[u].push_back(tot); 20 edge[tot++] = Edge(u, v, cap); 21 G[v].push_back(tot); 22 edge[tot++] = Edge(v, u, 0); 23 } 24 25 int BFS() { // 找層次圖 26 queue<int> que; 27 while(!que.empty()) que.pop(); 28 memset(dis, INF, sizeof(dis)); 29 que.push(S); 30 dis[S] = 0; 31 while(!que.empty()) { 32 int u = que.front(); que.pop(); 33 for(int i = 0; i < G[u].size(); i++) { 34 Edge &e = edge[G[u][i]]; 35 if(dis[e.v] == INF && e.cap > 0) { 36 dis[e.v] = dis[u] + 1; 37 que.push(e.v); 38 } 39 } 40 } 41 return dis[T] != INF; 42 } 43 44 int DFS(int u, int maxflow) { // 找增廣路 45 if(u == T) return maxflow; // 46 for(int i = cur[u]; i < G[u].size(); i++) { 47 cur[u] = i; // 當前弧優化 48 Edge &e = edge[G[u][i]]; 49 if(dis[e.v] == dis[u] + 1 && e.cap > 0) { 50 int flow = DFS(e.v, min(e.cap, maxflow)); // 找到增廣路上最小的流量增量 51 if(flow) { 52 e.cap -= flow; 53 edge[G[u][i]^1].cap += flow; 54 return flow; 55 } 56 } 57 } 58 return 0; // 找不到增廣路 59 } 60 61 int Dinic() { 62 int ans = 0; 63 while(BFS()) { 64 int flow; 65 memset(cur, 0, sizeof(cur)); 66 while(flow = DFS(S, INF)) ans += flow; 67 } 68 return ans; 69 }

?

轉載于:https://www.cnblogs.com/fightfordream/p/6208921.html

總結

以上是生活随笔為你收集整理的Dinic算法模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。