hdu1532 最大流板子題

2022-05-20 11:56:25 字數 1788 閱讀 2864

題目給出源點和漏點,還有一些邊,要求源與漏之間的最大流,我採用了edmonds karp演算法,該演算法是ford-fulkerson演算法的一種實現,該演算法的關鍵技術是殘留網路和殘留網路上的反向邊,相當於給了搜尋策略乙個「反悔」的機會,演算法的實行過程是每次都尋找一條源點到漏點的增廣路徑,算出流的大小,每次尋找到一條路徑就進行累加直到無法尋找到一條增廣路徑。尋找增廣路徑的一般做法是bfs,用dfs的話迭代的次數可能會非常大,十分消耗速度。在edmonds karp演算法中,一次增廣路徑的查詢需要消耗o(|e|)的時間,在o(|v||e|)次增廣之後最大流就能被找到,所以edmonds karp 演算法的時間複雜度大約是o(|v||e|^2),複雜度在邊多的情況下是非常高的,還有其他如dinic、isap演算法等最大流演算法,本次我先自寫乙個edmondskarp演算法。

**如下:

1 #include2

using

namespace

std;

3 typedef unsigned int

ui;4 typedef long

long

ll;5 typedef unsigned long

long

ull;

6#define pf printf

7#define mem(a,b) memset(a,b,sizeof(a))

8#define prime1 1e9+7

9#define prime2 1e9+9

10#define pi 3.14159265

11#define lson l,mid,rt<<1

12#define rson mid+1,r,rt<<1|1

13#define scand(x) scanf("%llf",&x)

14#define f(i,a,b) for(int i=a;i<=b;i++)

15#define scan(a) scanf("%d",&a)

16#define mp(a,b) make_pair((a),(b))

17#define p pair18

#define dbg(args) cout<<#args<<":"<19

#define inf 0x3f3f3f3f

20const

int maxn=1005;21

intn,m,t;

22 inline int

read()

26while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'

0',ch=getchar();

27return ans*w;28}

29int g[maxn][maxn],pre[maxn];//

這裡的g陣列不但儲存了正向邊的資訊還儲存了殘留網路的資訊

30int bfs(int src,int

sink)

3149}50

}

51if(pre[sink]==-1)return -1;//

漏點沒有被搜尋到

52return

flow[sink];

53}

54int maxflow(int src,int

sink)

5569 maxflow+=flow;70}

71return

maxflow;72}

73int

main()

7487 pf("

%d\n

",maxflow(1

,n));88}

8990 }

最大流模板題 HDU 1532

hdu 1532 題意 給你m條邊 但向邊 n個點,n個點的編號為1到n,問從1到n的最大流是多少。最大流模板題,聽說有重邊,但是沒管重邊這個事也過了。dinic演算法 include define mem a,b memset a b,sizeof a define de coutvoid add...

hdu 1532最大流 增廣路

include include include includeusing namespace std define max 210 int flow max max int pre max mark max int n,m,f int q,z void maxliu if mark n 如果mark...

hdu1532 網路流最大流問題

這是我的網路流第一題,用的是增廣路演算法即ek演算法,演算法思想 每次用bfs找一條最短的增廣路徑,然後沿著這條路徑修改流量值 實際修改的是殘量網路的邊權 順帶修改反圖的殘餘網路的邊權。當沒有增廣路時,演算法停止,此時的流就是最大流。還有這裡之所以要建反圖是因為,bfs找最短的增廣路的時候是隨機找的...