使用Ford-Fulkerson 标号法求网络最大流。

①c、f初始化为INF表示该边不存在

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <iomanip>
#include <algorithm>
#define maxn 10010
#define INF 0xfffffff
using namespace std;
struct ArcType
{int c,f;//容量、流量
};
ArcType edge[maxn][maxn];
int n,m;//顶点数、弧数
int flag[maxn];//顶点状态:-1——未标号;0——已标号未检查;1——已标号已检查
int prev[maxn];//标号的第一个分量:指明标号从哪个顶点而来,以便找出可改进量
int alpha[maxn];//标号的第二个分量:可改进量α
int que[maxn];//相当于BFS中的队列
int v;//队列头元素
int qs,qe;//队首队尾的位置
int i,j;
void ford()//标号法求网络最大流
{while(1)//标号,直到不存在可改进路{memset(flag,-1,sizeof(flag));memset(prev,-1,sizeof(prev));memset(alpha,-1,sizeof(alpha));flag[0]=0;prev[0]=0;alpha[0]=INF;qs=qe=0;que[qe]=0;//源点0入队列++qe;while(qs<qe&&flag[n-1]==-1){v=que[qs];//取队首元素++qs;for(i=0; i<n; ++i)//检查顶点v的正向和反向邻接点if(flag[i]==-1){if(edge[v][i].c<INF&&edge[v][i].f<edge[v][i].c)//正向且未满{flag[i]=0;//给顶点i标号,但此时未检查prev[i]=v;alpha[i]=min(alpha[v],edge[v][i].c-edge[v][i].f);que[qe]=i;//顶点i入队++qe;}else if(edge[i][v].c<INF&&edge[i][v].f>0)//反向且有流量{flag[i]=0;prev[i]=-v;alpha[i]=min(alpha[v],edge[i][v].f);que[qe]=i;++qe;}}flag[v]=1;//标记顶点i已经检查}if(flag[n-1]==-1||alpha[n-1]==0) break;//汇点无标号或汇点的调整量为0int k1=n-1,k2=abs(prev[k1]);int a=alpha[n-1];//可改进量αwhile(1){if(edge[k2][k1].f<INF) edge[k2][k1].f+=a;//正向else edge[k1][k2].f-=a;//反向if(k2==0) break;//一直调整到源点0k1=k2;k2=abs(prev[k2]);}}int maxflow=0;//最大流量for(i=0; i<n; ++i)for(j=0; j<n; ++j){if(i==0&&edge[i][j].f<INF) maxflow+=edge[i][j].f;if(edge[i][j].f<INF) cout<<i<<"->"<<j<<":"<<edge[i][j].f<<endl;}cout<<"maxflow:"<<maxflow<<endl;
}
int main()
{int u,v,c,f;//弧的起点终点容量流量cin>>n>>m;//顶点个数、弧数for(i=0; i<n; ++i)for(j=0; j<n; ++j)edge[i][j].c=edge[i][j].f=INF;//初始化,INF表示无边相连for(i=0; i<m; ++i){cin>>u>>v>>c>>f;edge[u][v].c=c;//构造邻接矩阵edge[u][v].f=f;}ford();return 0;
}
/*
6 10
0 1 8 2
0 2 4 3
1 3 2 2
1 4 2 2
2 1 4 2
2 3 1 1
2 4 4 0
3 4 6 0
3 5 9 3
4 5 7 2
*/

②未初始化

void ford()//标号法求网络最大流
{int flow[maxn][maxn];//节点之间的流量Fijint prev[maxn];//可改进路径上前一个节点的标号,相当于标号的第一个分量int minflow[maxn];//每个顶点的可改进量α,相当于标号的第二个分量int que[maxn];int qs,qe;//队列首尾位置坐标int v,p;//当前顶点、保存Cij-Fijfor(i=0; i<maxn; ++i)for(j=0; j<maxn; ++j)flow[i][j]=0;minflow[0]=INF;//源点标号的第二分量为无穷大while(1)//标号法{for(i=0; i<maxn; ++i)//每次标号前,每个顶点重新回到未标号状态prev[i]=-2;prev[0]=-1;qs=0;que[qs]=0;//源点入队qe=1;while(qs<qe&&prev[t]==-2){v=que[qs];//取队列头节点++qs;for(i=0; i<t+1; ++i)//prev[i]==-2表示顶点i未标号if(prev[i]==-2&&(p=edge[v][i].c-flow[v][i]))//edge[v][i].c-flow[v][i]!=0能保证i是v邻接顶点且能进行标号{prev[i]=v;que[qe]=i;++qe;minflow[i]=(minflow[v]<p)?minflow[v]:p;}}if(prev[t]==-2) break;//汇点t无标号,标号法结束for(i=prev[t],j=t; i!=-1; j=i,i=prev[i])//调整过程{flow[i][j]+=minflow[t];flow[j][i]=-flow[i][j];}}for(i=0,p=0; i<t; ++i)//统计进入汇点的流量即最大流的流量p+=flow[i][t];cout<<p<<endl;
}

Ford-Fulkerson 标号法求网络最大流相关推荐

  1. 用标号法求最短路径matlab,标号法求最短路径问题

    dijstra算法 最短路径 运筹学 教学目标: 教案 标题:标号法求最短路径问题 1.通过本节学习,使学生掌握标号法的步骤: 2.通过本节学习,学生能够应用标号法求解配送路径问题 教学重点及难点: ...

  2. dijkstra标号法表格_标号法求最短路径例题详解.ppt

    标号法求最短路径例题详解 r * 最短路径 带权图G=, 其中w:E?R. ?e?E, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =?. 设 ...

  3. 用标号法求最短路径matlab,标号法求最短路径例题详解重点.ppt

    r * 最短路径 带权图G=, 其中w:E?R. ?e?E, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =?. 设L是G中的一条路径, L的 ...

  4. 用标号法求最短路径matlab,标号法求最短路径例题分析.ppt

    r * 最短路径 带权图G=, 其中w:E?R. ?e?E, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =?. 设L是G中的一条路径, L的 ...

  5. 变量循环重新标号法求对称正定矩阵逆矩阵

    一 算法原理 对称矩阵特征值算法 雅可比方法用于求解实对称矩阵的特征值和特征向量,对于实对称矩阵AAA,必有正交矩阵UUU,使得UTAU=DU^{T}AU=DUTAU=D.DDD是一个对角阵,主对角线 ...

  6. 最大流的Ford-Fulkerson 标号法

    最大流标号法: https://wenku.baidu.com/view/5977dc6fa45177232f60a266.html 最大流的标号法总的来说就是不断地在图中找增广路径.增广路径就是一条 ...

  7. 最大流(标号法 Ford-Fulkerson算法)

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; cons ...

  8. 网络最大流模板(标号法)

    测试数据 6 10 0 1 8 2 0 2 4 3 1 3 2 2 1 4 2 2 2 1 4 2 2 3 1 1 2 4 4 0 3 4 6 0 3 5 9 3 4 5 7 2 0->1:4 ...

  9. POJ-1149-PIGS(最大流 标号法)

    PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20033 Accepted: 9179 Description Mir ...

最新文章

  1. RMAN快速入门指南
  2. Openstack组件实现原理 — Glance架构(V1/V2)
  3. 微软独立虚拟机Hyper-V Server 2008
  4. 计算机制片管理系统,Agile Shot:新一代影视制片流程管理系统大揭秘
  5. mysql删除七天_自动备份mysql并删除7天前备份
  6. 11种图像清晰度评价函数
  7. 苹果和虫子问题C++
  8. Linux上监控tomcat down掉后自动重启tomcat
  9. 《跟唐老师学习云网络》 - 什么是VLAN和VXLAN
  10. Java架构师面试问些什么?微服务之springcloud面试题(共22题,含详细解答)
  11. 最新消息:更多的Windows Azure Marketplace Content 和Hands On Lab
  12. Asp.Net中的正则表达式问题可以在此提问,今后大家一起研究!贴出基本语法参考...
  13. 天津联通集中备份系统应用
  14. fiddler4安装教程以及手机下载证书时报错 no root certificate was found解决方法
  15. RTMP播放器网页互联网直播音视频流媒体播放器EasyPlayer-RTMP-iOS播放H265格式的视频源
  16. 手记---道可道,非常道
  17. 终于懂了汇编代码为什么从键盘上输入字符,将该字符的ASCII显示在屏幕上必须要加30或37(附汇编代码)
  18. 文件夹加密超级大师 v13.10 是什么
  19. 持续交付的软件系统架构
  20. 苹果公司的企业文化_【全景标杆】乔布斯给苹果留下了什么样的企业文化?

热门文章

  1. Mac安装Adobe Zii5.3.0过程
  2. Python 根据身高体重计算BMI值
  3. 铁柱学习node.js
  4. linux下的串口编程
  5. 一图看懂中国AI战场局势:只有百度和华为真的在做AI
  6. [linux-023]在thinkpad T480上安装ubuntu 20.04 LTS
  7. san-miguelbunny
  8. IP地址划分与子网掩码
  9. 不知道视频怎样提取音频?这里有详细教程分享
  10. SpringBoot实现微信登录