增广路径求解最大流

关于什么是最大流。我说不清楚,而且也没有别人的比喻生动。

【主要是我懒,不想画图】

算法的核心在于:找到增广路径,修改它,继续找,直到没有。

While ( findAugmentPath() ) // 判断是否有增广路
	maxFlow = maxFlow + delta // 最大流增加
	modifyGraph() // 对增广路进行修改
End While

最近智商有点不够用。想了很久才想通findAugmentPath()函数。
利用的是BFS。
 1 int i,j,u,v;
 2     int flag=0;
 3     for(i=0;i<n;i++)
 4     {
 5         queue[i]=0;//bfs算法的队列
 6         visited[i]=0;//是否被访问
 7         path[i]=0;//保存走过的路
 8         capacity[i]=0;//最大流
 9     }//初始化
10     int tail=0;//tail标记此时bfs到哪个地方了
11     queue[tail]=0;
12     capacity[0]=inf;
13     visited[0]=1;
14     i=0;
15     while(i<=tail)
16     {
17         u=queue[i];
18         if(u==n-1)//如果目的点入队说明存在增广路径
19         {
20             flag=1;
21             return capacity[n-1];
22             
23         }
24             
25         for(v=0;v<n;v++)//bfs
26         {
27             if(r[u][v]>0&&r[u][v]!=inf&&visited[v]==0)
28                 {
29                     //cout<<v<<endl;
30                     path[v]=u;
31                     capacity[v]=min(r[u][v],capacity[u]);
32                     visited[v]=true;
33                     tail=tail+1;
34                     queue[tail]=v;
35                 }
36             
37         }
38         i++;
39     }
View Code

我在想如果只是需要找到一条增广路径,然后修改它,dfs算法也可以。【于是给自己挖了一个坑】

对增广路径的修改,就是找到了某一个路径的最大流,然后经过的路径全部减去这个最大流,意思是下次这里不通了。

 1 void modifyGraph()
 2 {
 3     int flow=capacity[n-1];
 4     int now=n-1;
 5     while(now!=0)
 6     {
 7         int fa=path[now];
 8         r[fa][now]=r[fa][now]-flow;
 9     //    r[now][fa]=r[now][fa]+flow;
10         now=fa;
11             
12     } 
13 }
View Code

 

转载于:https://www.cnblogs.com/zhenzhenhuang/p/5877566.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值