hdu 3549 Flow Problem(增广路算法)

本文介绍了一个基于 Edmonds-Karp 算法的最大流问题解决方案。该算法通过不断寻找增广路径来逐步增加流量,直至无法再找到新的路径为止。代码实现了 BFS 查找增广路的过程,并更新流量矩阵。

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549

模板题,白书上的代码。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 using namespace std;
 7 
 8 const int INF=1<<28;
 9 int cap[30][30],flow[30][30],n;
10 
11 int Edmonds_Karp(int s,int t)
12 {
13     int a[30],p[30];
14     int f;
15     queue<int>q;
16     memset(flow,0,sizeof(flow));
17     f=0;
18     while(1)
19     {
20         memset(a,0,sizeof(a));
21         a[s]=INF;
22         q.push(s);
23         while(!q.empty())     //bfs找增广路
24         {
25             int u=q.front();
26             q.pop();
27             for(int v=1; v<=n; v++)
28             if(!a[v]&&cap[u][v]>flow[u][v])  //找到新节点v
29             {
30                 p[v]=u;   q.push(v);         //记录v的父亲,并加入FIFO队列
31                 a[v]=min(a[u],cap[u][v]-flow[u][v]);  //s-v路径上的最小残量
32             }
33         }
34         if(a[t]==0) break;         //找不到,则当前流已经是最大流
35         for(int u=t; u!=s; u=p[u])  //从汇点往回走
36         {
37             flow[p[u]][u]+=a[t];     //更新正向流量
38             flow[u][p[u]]-=a[t];     //更新反向流量
39         }
40         f+=a[t];                    //更新从s流出的总流量
41     }
42     return f;
43 }
44 int main()
45 {
46     int t,m,x=1;
47     int u,v,w;
48     scanf("%d",&t);
49     while(t--)
50     {
51         memset(cap,0,sizeof(cap));
52         scanf("%d%d",&n,&m);
53         while(m--)
54         {
55             scanf("%d%d%d",&u,&v,&w);
56             cap[u][v]+=w; //考虑重边
57         }
58 
59         printf("Case %d: ",x++);
60         printf("%d\n",Edmonds_Karp(1,n));
61     }
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/bfshm/p/3544999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值