流演算法
Ⅰ 求平面圖最大流演算法
對於一個s-t平面圖,我們對其進行如下改造:
1.n連接s和t,得到一個附加面
2.求該圖的對偶圖G*:令附加面對應的點為s*,無界面對應的點為t*
3.刪去s*和t*之間的邊
一條從s*到t*的路徑,就對應了一個s-t割!
更進一步,如果我們令每條邊的長度等於它的容量,那麼最小割的容量就等於最短路的長度!
分析一下時間復雜度n新圖中的點數和邊數都是O(n)的n使用二叉堆優化的Dijkstra演算法求最短路,時間復雜度為O(nlog2n)
Ⅱ 流速計算公式是什麼
Q=Sv=常量。
流速,液體單位時間內的位移。質點流速是描述液體質點在某瞬時的運動方向和運動快慢的矢量。其方向與質點軌跡的切線方向一致。其大小為:u=lim<△t→0> △s/△t=ds/dt。單位為m/s,△s為液體質點在△t時間內流動的距離。
流量的方程為:Q=Sv=常量。(S為截面面積,v為水流速度)(流體力學上長用Q=AV),單位是立方米每秒。
不可壓縮的流體作定常流動時,通過同一個流管各截面的流量不變。
對在一定通道內流動的流體的流量進行測量統稱為流量計量。流量測量的流體是多樣化的,如測量對象有氣體、液體、混合流體;流體的溫度、壓力、流量均有較大的差異,要求的測量准確度也各不相同。因此,流量測量的任務就是根據測量目的,被測流體的種類、流動狀態、測量場所等測量條件,研究各種相應的測量方法,並保證流量量值的正確傳遞。
Ⅲ c/c++ 最大流演算法ford-fulkerson
你的問題是用C/C++寫最大流演算法ford-fulkerson演算法。頂點就是節點。
void maximum_flow(int n, int s, int t, int *capacity, int *flow)
可以參考:演算法模板-最大流(Ford-fulkerson演算法)
Ⅳ 網咯流演算法經典問題
這樣建圖
點0表示源點
點1是一個限制場點加的點
點2到點N+1表示阿P的賽車標號
點N+2到點2*N+1表示阿Q的賽車標號
點2*N+2表示匯點
場次的限制
點0到點1的流量為M,表示限制最多有M場賽,最多也就贏M場
賽車與賽車之間的關系
如果阿P的第i輛賽車能贏阿Q的賽車,就從點 2+i-1 到點 N+2+j-1 有一條流量為1的邊
賽車使用次數的限制
限制阿P的車,用點1來限制,點1到阿P某輛賽車的流量是此賽車的壽命
限制阿Q的賽車用匯點來限制,阿Q某輛賽車到匯點的流量是這輛車的壽命
求個最大流,over
Ⅳ 網路最大流演算法通常應用在什麼方面
首先是網路流中的一些定義:
V表示整個圖中的所有結點的集合.
E表示整個圖中所有邊的集合.
G = (V,E) ,表示整個圖.
s表示網路的源點,t表示網路的匯點.
對於每條邊(u,v),有一個容量c(u,v) (c(u,v)>=0),如果c(u,v)=0,則表示(u,v)不存在在網路中。相反,如果原網路中不存在邊(u,v),則令c(u,v)=0.
對於每條邊(u,v),有一個流量f(u,v).
一個簡單的例子.網路可以被想像成一些輸水的管道.括弧內右邊的數字表示管道的容量c,左邊的數字表示這條管道的當前流量f.
網路流的三個性質:
1、容量限制: f[u,v]<=c[u,v]
2、反對稱性:f[u,v] = - f[v,u]
3、流量平衡: 對於不是源點也不是匯點的任意結點,流入該結點的流量和等於流出該結點的流量和。
只要滿足這三個性質,就是一個合法的網路流.
最大流問題,就是求在滿足網路流性質的情況下,源點 s 到匯點 t 的最大流量。
求一個網路流的最大流有很多演算法 這里首先介紹 增廣路演算法(EK)
學習演算法之前首先看了解這個演算法中涉及到的幾個圖中的定義:
**殘量網路
為了更方便演算法的實現,一般根據原網路定義一個殘量網路。其中r(u,v)為殘量網路的容量。
r(u,v) = c(u,v) – f(u,v)
通俗地講:就是對於某一條邊(也稱弧),還能再有多少流量經過。
Gf 殘量網路,Ef 表示殘量網路的邊集.
這是上面圖的一個殘量網路。殘量網路(如果網路中一條邊的容量為0,則認為這條邊不在殘量網路中。
r(s,v1)=0,所以就不畫出來了。另外舉個例子:r(v1,s) = c(v1,s) – f(v1,s) = 0 – (-f(s,v1)) = f(s,v1) = 4.
其中像(v1,s)這樣的邊稱為後向弧,它表示從v1到s還可以增加4單位的流量。
但是從v1到s不是和原網路中的弧的方向相反嗎?顯然「從v1到s還可以增加4單位流量」這條信息毫無意義。那麼,有必要建立這些後向弧嗎?
顯然,第1個圖中的畫出來的不是一個最大流。
但是,如果我們把s -> v2 -> v1 -> t這條路徑經過的弧的流量都增加2,就得到了該網路的最大流。
注意到這條路徑經過了一條後向弧:(v2,v1)。
如果不設立後向弧,演算法就不能發現這條路徑。
**從本質上說,後向弧為演算法糾正自己所犯的錯誤提供了可能性,它允許演算法取消先前的錯誤的行為(讓2單位的流從v1流到v2)
注意,後向弧只是概念上的,在程序中後向弧與前向弧並無區別.
**增廣路
增廣路定義:在殘量網路中的一條從s通往t的路徑,其中任意一條弧(u,v),都有r[u,v]>0。
如圖綠色的即為一條增廣路。
看了這么多概念相信大家對增廣路演算法已經有大概的思路了吧。
Ⅵ 求數據結構關於最大流演算法的PPT
您好,我看到您的問題很久沒有人來回答,但是問題過期無人回答會被扣分的並且你的懸賞分也會被沒收!所以我給你提幾條建議: 一,你可以選擇在正確的分類下去提問,這樣知道你問題答案的人才會多一些,回答的人也會多些。 二,您可以到與您問題相關專業網站論壇里去看看,那裡聚集了許多專業人才,一定可以為你解決問題的。 三,你可以向你的網上好友問友打聽,他們會更加真誠熱心為你尋找答案的,甚至可以到相關網站直接搜索. 四,網上很多專業論壇以及知識平台,上面也有很多資料,我遇到專業性的問題總是上論壇求解決辦法的。 五,將你的問題問的細一些,清楚一些!讓人更加容易看懂明白是什麼意思! 謝謝採納我的建議!
Ⅶ 到底什麼是流計算
在傳統的數據處理流程中,總是先收集數據,然後將數據放到DB中。當人們需要的時候通過DB對數據做query,得到答案或進行相關的處理。這樣看起來雖然非常合理,但是結果卻非常的緊湊和,尤其是在一些實時搜索應用環境中的某些具體問題,類似於MapRece方式的離線處理並不能很好地解決問題。這就引出了一種新的數據計算結構---流計算方式。它可以很好地對大規模流動數據在不斷變化的運動過程中實時地進行分析,捕捉到可能有用的信息,並把結果發送到下一計算節點。
Ⅷ 網路流的最大流演算法
1、augment path,直譯為「增廣路徑」,其思想大致如下:
原有網路為G,設有一輔助圖G',其定義為V(G') = V(G),E(G')初始值(也就是容量)與E(G)相同。每次操作時從Source點搜索出一條到Sink點的路徑,然後將該路徑上所有的容量減去該路徑上容量的最小值,然後對路徑上每一條邊<u,v>添加或擴大反方向的容量,大小就是剛才減去的容量。一直到沒有路為止。此時輔助圖上的正向流就是最大流。
我們很容易覺得這個演算法會陷入死循環,但事實上不是這樣的。我們只需要注意到每次網路中由Source到Sink的流都增加了,若容量都是整數,則這個演算法必然會結束。
尋找通路的時候可以用DFS,BFS最短路等演算法。就這兩者來說,BFS要比DFS快得多,但是編碼量也會相應上一個數量級。
增廣路方法可以解決最大流問題,然而它有一個不可避免的缺陷,就是在極端情況下每次只能將流擴大1(假設容量、流為整數),這樣會造成性能上的很大問題,解決這個問題有一個復雜得多的演算法,就是預推進演算法。
2、push label,直譯為「預推進」演算法。
3、壓入與重標記(Push-Relabel)演算法
除了用各種方法在剩餘網路中不斷找增廣路(augmenting)的Ford-Fulkerson系的演算法外,還有一種求最大流的演算法被稱為壓入與重標記(Push-Relabel)演算法。它的基本操作有:壓入,作用於一條邊,將邊的始點的預流盡可能多的壓向終點;重標記,作用於一個點,將它的高度(也就是label)設為所有鄰接點的高度的最小值加一。Push-Relabel系的演算法普遍要比Ford-Fulkerson系的演算法快,但是缺點是相對難以理解。
Relabel-to-Front使用一個鏈表保存溢出頂點,用Discharge操作不斷使溢出頂點不再溢出。Discharge的操作過程是:若找不到可被壓入的臨邊,則重標記,否則對臨邊壓入,直至點不再溢出。演算法的主過程是:首先將源點出發的所有邊充滿,然後將除源和匯外的所有頂點保存在一個鏈表裡,從鏈表頭開始進行Discharge,如果完成後頂點的高度有所增加,則將這個頂點置於鏈表的頭部,對下一個頂點開始Discharge。
Relabel-to-Front演算法的時間復雜度是O(V^3),還有一個叫Highest Label Preflow Push的演算法復雜度據說是O(V^2*E^0.5)。我研究了一下HLPP,感覺它和Relabel-to-Front本質上沒有區別,因為Relabel-to-Front每次前移的都是高度最高的頂點,所以也相當於每次選擇最高的標號進行更新。還有一個感覺也會很好實現的演算法是使用隊列維護溢出頂點,每次對pop出來的頂點discharge,出現了新的溢出頂點時入隊。
Push-Relabel類的演算法有一個名為gap heuristic的優化,就是當存在一個整數0<k<V,沒有任何頂點滿足h[v]=k時,對所有h[v]>k的頂點v做更新,若它小於V+1就置為V+1。
cpp程序: #include<cstdio>#include<cstring>#include<algorithm>#include<queue>#;inttt,kase;intnn,m;intH[45],X[1004],P[1004],flow[1004],tot,cap[1005];intd[45];intS,T;voidadd(intx,inty,intz){P[++tot]=y;X[tot]=H[x];H[x]=tot;flow[tot]=z;cap[tot]=flow[tot];}queue<int>q;boolbfs(){memset(d,0,sizeof(d));d[S]=1;intx;q.push(S);while(!q.empty()){x=q.front();q.pop();for(inti=H[x];i;i=X[i]){if(flow[i]>0&&!d[P[i]]){d[P[i]]=d[x]+1;q.push(P[i]);}}}returnd[T];}intdfs(intx,inta){if(x==T||a==0)returna;intf=a,tmp;for(inti=H[x];i;i=X[i]){if(flow[i]>0&&d[P[i]]==d[x]+1){tmp=dfs(P[i],min(flow[i],a));flow[i]-=tmp;a-=tmp;flow[i^1]+=tmp;if(!a)break;}}if(f==a)d[x]=-1;returnf-a;}intDinic(){intf=0;while(bfs())f+=dfs(S,inf);returnf;}intmain(){/**輸入過程省略**/intmaxflow=Dinic();printf(%d
,maxflow);return0;}
Ⅸ 什麼是最大流演算法
最大流不是一個演算法,是一個問題。關於這個問題有很多演算法。比如找增廣路的,預留推進的。。。時間效率各有不同。
最大流問題,你可以這樣想像:源點是工廠,匯點是客戶,工廠到客戶間有很多條有運貨量限制的道路,問工廠到客戶最多可以運多少貨。
這些都可以通過程序實現~至於為什麼要用MATLAB,我就不清楚了~~