❶ 網路理論的最大流量問題
當物質流或信息流通過給定的網路時(圖1),在流過每條邊的流量xij不超過該邊允許通過的流量cij的條件下,求出從發點s向收點t輸出的最大流量f,即在滿足的條件下,使f最大。最大流量問題是一個特殊的線性規劃問題,有許多求解方法。一種有效的計算方法是福特-富爾克森法,它是根據最大流量-最小割集原理,通過標號演算法,求出在上述約束條件下從發點s到收點t的最大流量f 的數值。其計算步驟如下:①繪制一個能滿足上述約束條件的網路可行流(圖2)。邊上的數字為允許流量cij,括弧內的數字為給定的可行流。②找出一條增廣鏈。增廣鏈是指從發點s到收點t的鏈中,滿足正向邊上xij<cij和反向邊上xji>0的鏈。圖2中用粗線表示的{vs,v2,v3,v4,v6,vt} 是一條增廣鏈。其中【v2,v3】為反向邊,其餘均為正向邊。③調整可行流,即在增廣鏈的各邊上,屬正向邊加上一個修正量ε,屬反向邊減去一個修正量ε,即xij+εj,xji-εj。εj值由下式決定:當xij<cij時
❷ 最大網路流問題 ,誰能幫我把題目的代碼寫一下,用c++或c寫。 題目如下:
#include<iostream>
#include<基碼queue>
using namespace std;
#define INF 1000000000
struct node{
int from;
int to;
int flow;
}f[1000];
int n,m;
int maxf[1000];
bool vis[1000];
void bfs()
{
queue<int> p;
int i;
vis[1]=true;
p.push(1);
while(!p.empty())
{
int q=p.front();
p.pop();
for(i=1;i<=m;i++)
{
if(f[i].from==q)
{
if(vis[f[i].to]==0)
{
p.push(f[i].to);
vis[f[i].to]=true;
}
maxf[f[i].to]+=min(f[i].flow,maxf[q]);
}
}
}
cout<<爛鋒歷maxf[n]<<飢搜endl;
}
int main()
{
while(cin>>n>>m)
{
int i;
for(i=1;i<=m;i++)
{
cin>>f[i].from>>f[i].to>>f[i].flow;
}
memset(maxf,0,sizeof(maxf));
memset(vis,0,sizeof(vis));
maxf[1]=INF;
bfs();
}
return 0;
}
BFS解最大流。
❸ 求網路最大流
這題根據最小割盯蘆並-最大流(minimum cut - maxium flow) 定理,網路中最嘩攔大的流和最小割是相等的,這個圖中最小割是8,所以凱跡最大流也是8,圖中畫出了4個都是最小割
❹ 如何用excel求解網路最大流問題,求高手解答!
網路最大流有很多很雜的討論和研究,動不動就會搞上矩陣演算法。而且有些情況復雜,演算法無法證明其正確。這攤子水很深哇。如果是簡單拓撲,那麼Excel的規劃求解應該可以幫到你。
譬如,下圖連接中的案例,Excel 應該可以求解。如果你是類似的簡單拓撲,我們繼續討論下,純理論研究我就不要繼續了。
http://wendang..com/view/55c62e4569eae009581becc8.html
談談你的具體案子吧,說明白了才好有人幫你,否則可能像我這樣冒了風險,白白降低了答題採納率。
❺ 高分求網路最大流的問題『要步驟』
不好意思好像做錯了,呵呵,現在修改一下。
從V1出發到友虛喚V3最大流為10,再從好凱V3經V2到V5流量不受限制,因此V5處的流量還為10,V5到V7的最大流為7.
所譽雹以從V1到V7的最大流為7.
❻ edmonds-karp演算法是如何求最大流的
Edmonds-Karp 演算法步驟
每次通過BFS,找到殘余網路上從源點到匯點的一條最短增廣路
在流網路上增加增廣路
修改殘余網路,殘余容量減去增廣路,並添加增廣路的反向弧
當無法BFS到增廣路時,演算法結束
USER: CmYkRgB CmYkRgB [cmykrgb1]
TASK: ditch
LANG: C++
//對ford演算法的改進,變為多項試的。
/*
ID:cmykrgb1
PROG:ditch
LANG:C++
*/
#include<iostream>
#include<fstream>
#defineMAX201
usingnamespacestd;
classTadjl
{
public:
classTnode
{
public:
intr,v;
voidset(inttr,inttv)
{
r=tr;
v=tv;
}
};
intcnt;
Tnodelink[MAX];
};
classtQueue
{
public:
classlinklist
{
public:
linklist*next;
intvalue;
linklist()漏山
{
next=0;
value=0;
}
};
linklist*first,*last;
intsize;
voidadd(intp)
{
if(size==0)
first=last=newlinklist;
else
last=last->next=newlinklist;
last->value=p;
size++;
}
intdel()
{
intrtn=first->value;
linklist*tfirst=first;
first=first->next;
deletetfirst;
返讓中size--;
returnrtn;
}
voidreset()
{
size=0;
first=last=0;
}
tQueue()
{
reset();
}
};
ifstreamfi("ditch.in");
ofstreamfo("ditch.out");
Tadjladjl[MAX];
intN,M,ans;
inlineintmin(inta,intb)
{
returna<b?a:b;
}
voidinit()
{
inti,a,b,v;
fi>>N>>M;
for(i=1;i<=N;i++)
{
fi>>a>>b>>v;
adjl[a].link[++adjl[a].cnt].set(b,v);
}
}
intedmonds(intstart,intend)
{
inti,j,k;
intfather[MAX],fp[MAX],max[MAX];
intMaxflow=0;
memset(father,0,sizeof(father));
max[start]=0x7FFFFFFF;
tQueue*Q=newtQueue;
Q->add(start);
while(Q->size)
{
i=Q->del();
for(k=1;k<=adjl[i].cnt;k++)
{
j=adjl[i].link[k].r;
if(!adjl[i].link[k].v||j==start)continue;
if(!father[j])
滑談{
father[j]=i;
fp[j]=k;
max[j]=min(adjl[i].link[k].v,max[i]);
if(j==end)
{
Maxflow+=max[j];
while(father[j])
{
adjl[father[j]].link[fp[j]].v-=max[end];
adjl[j].link[++adjl[j].cnt].set(father[j],max[j]);
j=father[j];
}
memset(father,0,sizeof(father));
Q->reset();
Q->add(start);
break;
}
Q->add(j);
}
}
}
returnMaxflow;
}
voidprint()
{
fo<<ans<<endl;
fi.close();
fo.close();
}
intmain()
{
init();
ans=edmonds(1,M);
print();
return0;
}
❼ 網路流的最大流演算法
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;}
❽ 怎麼樣求網路的最大流和最小截集
怎樣求最大流:
用增廣路演算法。
怎樣求最小截集:
求最大流,然後從源點DFS。
❾ 網路最大流問題的求解步驟
第1步,令x=(xij)是任意整數可行流,可能是零流,給s一個永久標號(-, ∞)。}第2步(找增廣路),如果所有標號都已經被檢查,轉到第4步。 找到一個標號但未檢查的點i, 並做如下檢查,}對每一個弧(i,j),如果xij0,且j未標號,則給j一個標號(-i, δ(j) ),其中, δ(j)=min{xji , δ(i) }}第3步(增廣),由點t開始,使用指示標號構造一個增廣路,指示標號的正負則表示通過增加還是減少弧流量來增加還是減少弧流量來增大流量,抹去s點以外的所有標號,轉第二步繼續找增廣軌。}第4步(構造最小割),這時現行流是最大的,若把所有標號的集合記為S,所有未標號點的集合記為T,便得到最小割(S,T)。
❿ 求網路的最大流,最短路(正確回答一定加分,謝謝!非常感謝!)
問題專業性太強了,感覺已知條族搏鎮件不足。除了(V1,V5)告訴了容量5,其餘的都沒告訴,如果兆粗把不告訴都視為0,那麼顯然(V3,V4)為最大流20.建議參考http://www.doc88.com/p-992956398719.html和銀耐http://wenku..com/view/07896e42be1e650e52ea9988.html