Dinic算法----最大流常用算法之一

——沒有什么是一個BFS或一個DFS解決不了的;如果有,那就兩個一起。

最大流的$EK$算法雖然簡單,但時間復雜度是$O(nm^2)$,在競賽中不太常用。

競賽中常用的$Dinic$算法和$SAP$,其實也不太難。

那么,$Dinic$算法到底是什么呢?


?

多路增廣

$Dinic$算法最核心的內容就是多路增廣

沿著$EK$算法的過程:

我們有一個圖,如圖一。

按照套路,我們先$BFS$,找$S-T$最短路。所有的距離標號都畫在了圖二上($EK$算法可能用不到,但$Dinic$用得到)。

假設我們選的是$S-3-T$這條路,增廣。。。(如圖三,綠色)

然后我們再來一遍$BFS$。。。 等等!

細心的你可能也發現了,$S-1-T$也是一條$S-T$最短路。

那就增廣吧!(如圖四)

您可以檢查一下,這時候沒有長度為$2$的最短路了。

但EK算法不會這樣。它會再笨拙地$BFS$一遍,這就浪費了不少時間。

所以說,多路增廣是很重要的。

?

我們換一種思路,如果網絡流在一個$DAG$上,還不用考慮回退邊,你會怎么做?

這很簡單,$dfs$就能解決。

至于回退邊。。。再來一次$BFS-DFS$就好了啊。

還有一個優化:當前弧優化:

對于每個點,我可能在一次$BFS$之后$DFS$多次。那么它出發的邊所到的點里, 有些點出發已經滿流。

這樣, 我就可以每個點記錄一個當前弧, 表示這次$DFS$它最后$DFS$到哪條弧,下次$DFS$它的時候就從這條弧開始。

這樣,我就可以保證每條邊在一次$DFS$中滿流后不會再遍歷。

這樣的復雜度。。。理論上最壞是$O(n^2m)$,但這上界很松。

附代碼!

 1 int n;
 2 
 3 struct Dinic{
 4     struct Edge{
 5         int from, to;
 6         LL cap, flow;
 7         Edge(int f = -1, int t = -1, LL c = 0)
 8         :from(f), to(t), cap(c), flow(0)
 9         {}
10     }edges[MAXM];
11     int next[MAXM], cnt;
12     int pre[MAXN], dis[MAXN];
13     int cur[MAXN];                                    //當前弧
14     Dinic()
15     {
16         memset(pre, -1, sizeof(pre));
17         cnt = 0;
18     }
19     void addedge(int f, int t, LL c)
20     {
21         edges[cnt] = Edge(f, t, c);
22         next[cnt] = pre[f];
23         pre[f] = cnt++;
24         edges[cnt] = Edge(t, f, 0);
25         next[cnt] = pre[t];
26         pre[t] = cnt++;
27     } 
28     queue<int> Q;
29     bool BFS(int s, int t)
30     {
31         while(!Q.empty()) Q.pop();
32         memset(dis, -1, sizeof(dis));
33         dis[s] = 0;
34         Q.push(s);
35         while(!Q.empty())
36         {
37             int u = Q.front(); Q.pop();
38             for(int i = pre[u]; i >= 0; i = next[i]) if(edges[i].cap > edges[i].flow)
39             {
40                 int v = edges[i].to;
41                 if(dis[v] >= 0) continue;
42                 dis[v] = dis[u] + 1;
43                 if(v == t) return true;
44                 Q.push(v);
45             }
46         }
47         return false;
48     }
49     LL DFS(int now, int t, LL maxflow)            //當前在now,匯點t
50     {                                             //最大可以提供maxflow的流量 
51         if(now == t) return maxflow;
52         int ret = 0;
53         for(int i = cur[now] != -1 ? cur[now] : pre[now]; i >= 0; i = next[i]) if(edges[i].cap > edges[i].flow) 
54         {
55             int v = edges[i].to;
56             if(dis[v] != dis[now] + 1) continue;
57             int l = DFS(v, t, min(edges[i].cap - edges[i].flow, maxflow - ret));
58             ret += l;
59             edges[i].flow += l;
60             edges[i^1].flow -= l;
61             cur[now] = i;
62             if(ret == maxflow) return ret;
63         }
64         cur[now] = -2;
65         return ret;
66     }
67     LL solve(int s, int t)
68     {
69         int res = 0;
70         while(BFS(s,t)) 
71         {
72             memset(cur, -1, n * sizeof(int));
73             res += DFS(s, t, inf);
74         }
75         return res;
76     }
77 };
Dinic

?

代碼可能有錯,煩請指出。謝謝。

另外,如果有人知道些好用的畫圖軟件麻煩推薦一下。用windows自帶畫圖太累了。

轉載于:https://www.cnblogs.com/y-clever/p/6308820.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282950.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springcloud~Eureka實例搭建

服務端 build.gradle配置 dependencies {compile(org.springframework.cloud:spring-cloud-starter-netflix-eureka-server)testCompile(org.springframework.boot:spring-boot-starter-test) }dependencyManagement {imports {mavenBom "org.springframework.cloud:sprin…

php5.3教程,Php 5.3發布

PHP 5.3.4 特性&#xff1a; 增加對zip 流的統計支持 新增 follow_location (默認啟用)支持 增加一個 3rd parameter to get_html_translation_table Implemented FR #52348, added new constant ZEND_MULTIBYTE to detect zend multibyte at runtime. Multiple improvements t…

javascript學習筆記 null和undefined

null是javascript語言的關鍵字&#xff0c;它表示一個特殊值&#xff0c;常用來描述“空值”。對null執行typeof預算&#xff0c;結果返回字符串“object”&#xff0c;也就是說&#xff0c;可以將null認為是一個特殊的對象值&#xff0c;含義是“非對象”。但實際上&#xff0…

C# 為什么高手都是用IsNullOrWhiteSpace對字符串判空?

判斷字符串為空有好幾種方法&#xff1a;方法一&#xff1a; 代碼如下&#xff1a;static void Main(string[] args){string str "";if (str ""){Console.WriteLine("a is empty"); ;}Console.ReadKey();}運行結果&#xff1a;a is empty這樣…

使用bcftools提取指定樣本的vcf文件(extract specified samples in vcf format)

1、下載安裝bcftools。 2、準備樣本ID文件&#xff0c;這里命名為samplelistname.txt&#xff0c;一個樣本一行&#xff0c;如下所示&#xff1a; sample1 sample2 sample3 3、輸入命令&#xff1a; bcftools view -S samplelistname.txt /1000genomes/ALL.chr16.phase3_shapei…

iostat相關參數說明——await:平均每次設備I/O操作的等待時間 (毫秒),如果%util接近 100%,說明產生的I/O請求太多...

iostat是I/O statistics&#xff08;輸入/輸出統計&#xff09;的縮寫&#xff0c;iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況&#xff0c;同時也會匯報出 CPU使用情況。同vmstat一樣&#xff0c;iostat也有一個弱點&#xff0c;就是它不能對某…

php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之間的區別有哪些

MySQL和SQL之間的區別有哪些&#xff1f;很多PHP的初學者&#xff0c;對MySQL&#xff0c;MyAdmin和SQL有什么區別并不是很清楚&#xff1f;下面 第一PHP社區 就帶領大家來學習一下MySQL和SQL之間的區別。【推薦閱讀&#xff1a;MySQL什么意思】一&#xff1a;什么是SQLSQL是一…

Blazor University (51)依賴注入 —— 擁有多個依賴項:錯誤的方式

原文鏈接&#xff1a;https://blazor-university.com/dependency-injection/component-scoped-dependencies/owning-multiple-dependencies-the-wrong-way/擁有多個依賴項&#xff1a;錯誤的方式OwningComponentBase[1] 類是一個合適的解決方案&#xff0c;當我們需要我們的組件…

Centos的yum源更換為國內的阿里云源

1、備份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下載新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo 或者 curl -o /etc/yum.repo…

Centos 7 搭建.net web項目

現在的.NET Core 1.0版本是一個很小的核心&#xff0c;APIs和工具也并不完整&#xff0c;但是隨著.Net Core的不斷完善&#xff0c;補充的Apis和創新也會一起整合到.NET Framework中。 安裝centos系統 請自行安裝或百度教程 安裝 libicu包 和 dotnet 溫馨提示&#xff1a;如果需…

Effective Objective-C 2.0 編寫高質量iOS與OS X代碼的52個有效方法筆記-協議與分類...

23、通過委托與數據源協議進行對象間通信 如果要在委托對象上調用可選方法&#xff0c;那么必須提前使用類型信息查詢方法判斷這個委托對象能否響應相關選擇子。 if ( [_delegate respondsToSelector:selector(networkFetcher:didReceiveData:)]){ [_delegate networkFetcher:s…

用matlab求解工作時間調度問題,置換流水車間調度問題的MATLAB求解.doc

物流運籌實務課程設計題目&#xff1a;置換流水車間調度問題的MATLAB求解置換流水車間調度問題的MATLAB求解目錄前言……………………………………………………………………… 5問題描述………………………………………………………………… 6算法設計…………………………………

EntityFrameworkCore 模型自動更新(上)

【導讀】嗯&#xff0c;距離上一次寫博文已經過去近整整十個月&#xff0c;還是有一些思考&#xff0c;但還是變得懶惰了&#xff0c;心思也不再那么專注&#xff0c;有點耗費時間&#xff0c;學習也有點停滯不前&#xff0c;那就順其自然&#xff0c;隨心所欲吧&#xff0c;等…

IDEA 快捷注釋

1. 新建類的注釋模板 1) File->settings->Editor->Live Templates 2) 點擊綠色號&#xff0c;選擇template group &#xff0c;輸入group的name&#xff0c;然后點ok 3) 選中剛才添加的group,點擊號,選擇live Template 4) 代碼模板位置,個人用的代碼: 1 /** 2 * &…

matlab 如何hidden,Matlab基本函數-hidden函數

1、hidden函數&#xff1a;設置或取消隱藏線模式2、用法說明(1)hidden on 函數對當前圖形打開隱藏線條刪除&#xff0c;使網格圖后面的線條被前面的線條遮住。設置曲面圖形對象的屬性FaceColor為坐標軸背景顏色&#xff1b;(2)hidden off 函數對當前圖形關閉隱藏線條刪除&#…

java高級----Thread之CyclicBarrier的使用

CyclicBarrier是一個同步輔助類&#xff0c;它允許一組線程互相等待&#xff0c;直到到達某個公共屏障點 (common barrier point)。今天我們就學習一下CyclicBarrier的用法。 CyclicBarrier的簡單使用 類CyclicBarrier不僅有CountDownLatch所具有的功能&#xff0c;還可以實現屏…

異常處理,究竟是處理什么

“系統中每行代碼&#xff0c;都應該是有意義的&#xff0c;如果一段代碼可有可無&#xff0c;那它就不應該存在。”01—內容簡述異常處理是軟件開發的必備技能&#xff0c;但“異常處理&#xff0c;究竟是處理什么&#xff1f;”&#xff0c;很多小伙伴并沒有一個清晰的認識&a…

第十一篇:(順序)容器的好伴侶 --- 容器適配器

前言 vector容器的數據結構原型是順序表&#xff0c;它很好的實現了順序表的功能&#xff0c;大大方便了編程。好了&#xff0c;現在假設有天我又想用棧&#xff0c;那么有沒有棧對應的容器呢&#xff1f;很遺憾&#xff0c;木有。但基于“棧”可以由順序表或者鏈表實現這一特性…

第一季度ADC市場份額揭榜 A10 Networks再獲用戶青睞

近日&#xff0c;根據全球知名咨詢公司IDC 發布的2018年第一季度中國ADC市場分析報告顯示&#xff0c;A10 Networks 穩占中國ADC市場份額第二名。數據來源&#xff1a;IDC 2018年Q1 ADC市場報告 從廠商排名來看依次為 F5 30%, A10Networks 12%, DPtech 12% ,Sangfor 9% &#…

zblog php 標題優化,Zblog分類頁標題重復的優化 - 張力博客

今天瘋子無聊上自己博客看看&#xff0c;點了幾個頁面就發現一個問題。我博客分類頁的標題怎么第一頁和后面的頁數都是一樣的&#xff0c;這一點相信大家都知道對于SEO優化是很不好的一點。我也看了同樣的一些個人zblog博客也存在這樣的問題。于是我在網上就找了關于修改zblog分…