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,連續最短增廣路演算法 在最短增廣路演算法的基礎上改造 ...