网络最大流主要有两大类求解方法:增广路算法和预流推进算法

一般增广路算法:主要分为初始流为零流和初始流为非零流的情况!后者在标号的时候注意一条边是正向连接还是反向连接;若是反向的连接,那么在调整的时候是减去,若为正向那么在调整的时候是加上!

这里就poj1149为例写一道网络流中用标号法求解一般增广路的方法;

题目链接:http://poj.org/problem?id=1149

题目的关键在于如何构造一个容量网络!

1)将顾客看做除源点和汇点以外的顶点,并且另外设置两个节点,源点和汇点

2)如果源点和某一个节点的边有重复,那么就将权合并

3)源点和每个猪圈的第一位顾客连边,边的权值为猪圈中猪的数目

4)若顾客j在顾客i之后打开某个猪圈,则边<i,j>的权是+00,原因就是迈克可以调整各个猪圈中猪的数目来最大化限度的满足顾客的要求!

5)每个顾客和汇点之间连边,边的权就是顾客希望买到的猪的数目

#include <iostream>
#include <cstdio>
#include <cstring>
#define PIG_HOUSE_COUNT 1005
#define CONSUMER 105
#define INF 30000000
using namespace std;
int capacity[CONSUMER][CONSUMER];//每一条边上的容量
int flow[CONSUMER][CONSUMER];//每一条边的实际流量
int source,destination;//起点和终点
void init()
{int M,N;int i,j,temp;//temp,数据临时存储int PigArray[PIG_HOUSE_COUNT];//每个猪圈的猪的数目int KeyNumber;//每一个人拥有的钥匙数目int Pre[PIG_HOUSE_COUNT];//这个猪圈上一个的打开者scanf("%d%d",&M,&N);source=0;destination=N+1;memset(Pre,0,sizeof(Pre));memset(capacity,0,sizeof(capacity));memset(flow,0,sizeof(flow));for(i=0;i<M;i++)scanf("%d",&PigArray[i]);for(i=1;i<=N;i++){scanf("%d",&KeyNumber);for(j=0;j<KeyNumber;j++){scanf("%d",&temp);if(Pre[temp]==0)capacity[source][i]=capacity[source][i]+PigArray[temp-1];elsecapacity[Pre[temp]][i]=INF;Pre[temp]=i;}scanf("%d",&capacity[i][destination]);}
}void ford()
{int i,j;int queue[CONSUMER];//模拟队列int flag[CONSUMER];//标号为-1,表示起点;标号为非负数,表示该节点的上一个节点;int minadd[CONSUMER];int v;//当前的顶点int qh,qt,p;minadd[0]=INF;while(1)//对每一次标号---调整后,再重新标号{for(i=0;i<CONSUMER;i++)flag[i]=-2;//表示还没有标号flag[0]=-1;qh=0;queue[qh]=0;qt=1;while(qh<qt&&flag[destination]==-2)//用bfs查找邻接点{v=queue[qh];qh++;for(i=0;i<=destination;i++){if(flag[i]==-2&&(p=capacity[v][i]-flow[v][i])){minadd[i]=(minadd[v]<p) ? minadd[v]: p ;flag[i]=v;queue[qt++]=i;}}}if(flag[destination]==-2)break;for(i=flag[destination],j=destination;i!=-1;j=i,i=flag[i]){flow[i][j]+=minadd[destination];//对这次标号后的一条路进行增广flow[j][i]=-flow[i][j];}}for(i=0,p=0;i<destination;i++)p+=flow[i][destination];printf("%d\n",p);}
int main()
{init();ford();return 0;
}

网络最大流中一般增广路算法(标号法)相关推荐

  1. 网络流 之 一般增广路算法 标号法实现

    数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,c,f,分别表示这条弧的起点,终点,容量和流量.顶点序号从0开始. 代码 ...

  2. 网络流—Edmonds-Karp 最短增广路算法(最大流)

    网络流----Edmonds-Karp 最短增广路算法 ■求最大流的过程,就是不断找到一条源到汇的路径,然后构建残余网络,再在残余网络上寻找新的路径,使总流量增加,然后形成新的残余网络,再寻找新路径- ...

  3. 增广路算法 (最大流问题)

    Edmonds-Karp算法: 计算机科学中, Edmonds–Karp算法通过实现Ford–Fulkerson算法来计算网络中的最大流,其时间复杂度为O(V E2). 该算法由Yefim (Chai ...

  4. SAP和ISAP(网路最大流的两个增广路算法)

    ISAP是对SAP进行优化后的算法,ISAP时间复杂度为O(V^2E),SAP的时间复杂度为O(VE^2) SAP #include <iostream> #include <alg ...

  5. 网络流之 最短增广路算法模板(SAP)

    数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,w,分别表示这条弧的起点,终点,容量.顶点序号从0开始. 代码: 1 # ...

  6. 【网络流】解题报告:luogu P2740 [USACO4.2]草地排水Drainage Ditches(Edmonds-Karp增广路,最大流模板)

    题目链接:草地排水 若一条从源点到汇点的路径上各条边的剩余容量都大于0,则称这条路径为一条增广路. Edmonds-Karp增广路的策略就是不断用bfs寻找增广路,直至网络中不在存在增广路为止. 在每 ...

  7. 最短增广路Isap算法 网络流

    最短增广路 请先理解 bfs的求增广路的算法,再来学习Isap算法 最短增广路Isap算法 图片来源 <趣学算法>人民邮电出版社 陈小玉 /* 最短可增广路:重贴标签算法Isap 算法设计 ...

  8. hdu 1281(二分图匹配+增广路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 解题思路: 把棋盘的行x看成二分图左边的点,列y看成二分图右边的点,那么就把可以放车的位置看成是 ...

  9. XJOJ - 选信封(离散化+增广路)

    题目链接:点击查看 题目大意:Dumbulidone和Euphemia玩一个挑卡片游戏. Dumbulidone会给出N对信封,每个信封里有两张不同颜色的卡片,她会让Euphemia从中挑选任意个信封 ...

最新文章

  1. 兄弟们,TechEd见!
  2. Linux 学习日记 2: 目录结构和文件操作
  3. app测试之耗电量测试
  4. 3.1 go context代码示例
  5. 天津知青网6周年网庆-京剧-智取威虎山片段
  6. CSS3/ 弹性布局flex
  7. 手机wps取消不等宽分栏_如何取消分栏 - 卡饭网
  8. 未来论坛:AI决策的可靠性和可解释性
  9. JS判断页面是否出现滚动条
  10. 【视频专访】他用3年时间,从0开始打造专属大学生的IT教育品牌,只为将他们送入国内最顶尖IT名企。...
  11. RANDOM模块:PYTHON获取随机数
  12. 16进制颜色码转化rgba
  13. HART协议数据格式和消息结构的举例分析
  14. android手机无法root成功,安卓手机不能ROOT怎么办
  15. 哈工大深圳计算机实验室介绍,实验室介绍
  16. 动手学深度学习v2 课程笔记 — 深度学习基础
  17. mysql 处理转义'_mysql转义处理
  18. Web前端:木兰花令网页案例设计
  19. 建筑建材行业SaaS多租户用户管理系统:高度整合企业资源,探索数字化转型新路径
  20. numpy序列预处理dna序列_?12个很棒的Pandas和NumPy函数,让分析事半功倍

热门文章

  1. ERP已死,云计算上位
  2. Android -- XML属性
  3. java 读取excel数据
  4. Python_删除TXT文件中不想要的内容
  5. 算法设计与分析 实验三 回溯法求解地图填色问题
  6. Mysql语句计算文本字数_使用SQL来确定文本字段的字数统计
  7. 关机代码(强制关机)
  8. 16*32点阵c语言,16*32点阵的原理
  9. 使用exe4j把jar转换成exe文件时,报错java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite
  10. 18日精读掌握《费曼物理学讲义-卷一》计划(2019/6/12-2019/6/29)