核心思路:
(首先感謝網路大牛** 附大牛**:
我們首先 採用搜尋的方式 來找到一條從 s-t 的路徑 並且儲存記錄剩餘量,之後採用鍊錶的方式記錄下我們走的每一條路,反向回去更新路的流量(正是有了反向流量 我們在搜素的時候 才能夠有乙個"反悔"的機會)最終,找到重點,記錄最大流。
#include#includeusing namespace std;
const int n=201;
const int inf=99999999;
int n,m,sum;//s,t為始點和終點
int flow[n][n],cap[n][n],a[n],pre[n];
//分別為:flow[u][v]為流量、cap[u][v]為容量、a[i]表示源點s到節點i的路徑上的殘留量、pre[i]記錄i的前驅
void edmonds_karp(int s)}}
if(a[m]==0)//找不到增廣路,則當前流已經是最大流
break;
sum+=a[m];//流加上
for(i=m;i!=s;i=p[i])// //從匯點順著這條增廣路往回走
}printf("%d\n",sum);
}int main()
edmonds_karp(1);
}return 0;
}
那麼就目前而看 基礎的最大流演算法我們已經搞得比較通透了。。但是這串**只是個模板,還是要熟悉的運用。
總結: 最大流(用搜尋實現,依靠的還有一些圖論的思想,通過有向圖反向地邊權值來實現一種「反悔」的方法)
當然這還不是最優秀的演算法。還可以先bfs對圖進行分層 之後再搜尋一下,會更省時間(下篇再見)
5 1 最大子列和問題(思路)
給定k k個整數組成的序列,連續子列 被定義為n i 1 n jn j 其中 1 le i le j le k1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種...
最小費用最大流原理講解 spfa模板向和板子
最大流板子 如 果你 會最大流 那這個 基本上可 以秒懂。如果你會最大流,那這個基本上可以秒懂。如果你會最大 流,那這 個基本上 可以秒懂 問 題描 述 color問題描述 問題描述 給出一 個網路圖 以及其 源點s和 匯點 t給出乙個網路圖,以及其源點s和匯點t 給出乙個網路 圖,以及 其源點s ...
最大流演算法思想和理論的簡單理解
我退坑很久了,這篇文章不是因為刷oj而寫的總結,畢竟菜雞老年人,23333 之前我學網路流看的是演算法書和別人的部落格然後就開始套板子,而這次因為考試不得已把課本上的定理都看了一遍,瞬間對最大流演算法更加清楚了。在學習網路流演算法前要了解的一些知識。1.對於乙個有向的網路 g n,a,c 其中的 c...