最大流 FoldFulkerson演算法

2021-06-21 10:27:45 字數 1111 閱讀 5738

input:輸入包含多組用例,每組用例第一行是兩個數n,m,n表示一共有n個管道,m表示一共有m個點,接下來n行每行輸入三個數字a,b,c表示,a管道口到b管道口最大排水能力為c.

output:對每一組用例,輸出排水量的最大值

sample input:

5 41 2 40

1 4 20

2 4 20

2 3 30

3 4 10

sample output:

50

#include#include#define max 202

#define inf 999999999

bool bfs( int m );

void up_date( int k );

int min( int a , int b )

int min;

int rest[max][max] , pre[max];

//rest[i][j]表示i點到j點是否可灌水(非零就表示可灌)

//pre[k]表示bfs尋找增廣路徑時k的前驅

int main( )

while( bfs( m ) )

printf("%d\n",sum);

}return 0;

}bool bfs( int m )

for( k=1 ; k<=m ; k++ )}}

return false;

}void up_date( int k )

演算法分析:題目意思很明確,是求網路流中的最大流問題,該問題我採用了fold-fulkerson(福特-福克森)演算法,演算法分為兩個部分,求增廣路徑和更新路徑值,增廣路經就是有向圖中的源點到匯點的路徑中所有正向邊流量《最大流量;負向邊中流量》0則稱該路徑為增廣路徑;演算法求出增廣路徑上的權值最小值(管道剩餘排水量),該路徑可用增加這麼多的排水量.依次執行演算法到找不到增廣路經為止.注意:增廣路雖然是源點到匯點的一條路徑,不過不能首先dfs一次性找出所有路徑,因為在每次更新的時候可能其他某些路徑已經不是增廣路徑了.該演算法中rest[正]-=min,rest[負]+=min,bfs中的判斷if( !mark[k] && rest[s][k] )隱含的給出了圖已經被轉化為雙向圖了(雖然從輸入裡看不出).

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

網路最大流

1,一般增廣路演算法 採取標號法每次在容量網路中尋找一條增廣路進行增廣,直至不存在增廣路為止。增廣路方法 2,最短增廣路演算法 每個階段 在層次網路中,不斷用bfs演算法進行增廣直到 不存在增廣路為止。如果匯點不在層次網路中,則演算法中 止。3,連續最短增廣路演算法 在最短增廣路演算法的基礎上改造 ...