Edmonds-Karp算法,最大流POJ(1459)
题目链接:http://poj.org/problem?id=1459
解题报告:
电力调度站不涉及流的产生和消耗,不用考虑,Edmonds-Karp算法,就是利用剩余网络和增广路来解决,网络中的最大流。
原理:剩余网络,就是一种回退,构造完在剩余网络后,在剩余网络中找一条增广路,其中的最小流量,每个边加上这个最小流量或者减去这个最小流量,那么流就变成最大的了。
在加上或者减去这个最小流量时,初始化flow[][]这个剩余网络为0,最小流量node[v]=min(node[u],cap[u][v]-flow[u][v]),重新更新flow[][]+=node[t]后,就是真正的剩余网络了,cap[u][v]-flow[u][v]就表示的是这条边最大的流量了,这里也可以看出初始化flow[][]为0的目的了。
然后是,增广路的搜索,BFS广度优先搜索出每一条增广路,没找到一条增广路,就更新flow剩余网络,直到不存在增广路,就是说,直到原网络没有了任何的可以加上的流了。
这个题目,不能直接用传统意义上的最大流,因为这么没有一个绝对的源点和汇点,所以要建一个超级源点s,和超级汇点,n,n+1;

#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#define MAX 120 using namespace std; int n; ///节点数
int np; ///发电站数
int nc; ///消费者数
int m; ///传输线数
int cap[MAX][MAX]; ///网络的邻接矩阵 int from,to,value; ///形参s是超级源点,形参t是超级汇点
int EKarp(int s,int t) {
queue<int> Q; ///用于BFS的搜索队列
int flow[MAX][MAX]; ///剩余网络的邻接矩阵
int pre[MAX]; ///增广路径
int node[MAX]; ///增广路径上的最小流
int u,v;
int maxflow=; ///网络的最大流
///剩余网络的初始化
memset(flow,,sizeof(flow)); ///不断寻找增广路径
while(true) {
Q.push(s);
memset(node,,sizeof(node));
node[s]=; ///最小流量初值,无穷大 ///BFS算法,搜索增广路径
while(!Q.empty()) {
u=Q.front();
Q.pop(); for(v=; v<=t; v++) {
if(!node[v]&&cap[u][v]>flow[u][v]) {
Q.push(v);
node[v]=min(node[u],cap[u][v]-flow[u][v]);
pre[v]=u;
}
}
} ///当瓶颈容量为0时,说明不存在增广路径,搜索结束
if(node[t]==) break;
///根据增广路径和瓶颈容量,更新剩余网络
for(u=t; u!=s; u=pre[u]) {
flow[pre[u]][u]+=node[t];
flow[u][pre[u]]-=node[t];
} maxflow+=node[t];
}
return maxflow; ///总流量累加
} int main() {
while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) {
memset(cap,,sizeof(cap)); ///读取输电线的数据
while(m--) {
scanf(" (%d,%d)%d",&from,&to,&value);
cap[from][to]=value;
} ///读取发电站数据,构造超级源点
while(np--) {
scanf(" (%d)%d",&from,&value);
cap[n][from]=value;
} ///读取消费者数据,构造超级汇点
while(nc--) {
scanf(" (%d)%d",&from,&value);
cap[from][n+]=value;
} printf("%d\n",EKarp(n,n+));
}
return ;
}
Edmonds-Karp算法,最大流POJ(1459)的更多相关文章
- 最大流算法之Ford-Fulkerson算法与Edmonds–Karp算法
引子 曾经很多次看过最大流的模板,基础概念什么的也看了很多遍.也曾经用过强者同学的板子,然而却一直不会网络流.虽然曾经尝试过写,然而即使最简单的一种算法也没有写成功过,然后对着强者大神的代码一点一点的 ...
- 网络流(一)——Edmonds Karp算法
首先是一些关于网络流的术语: 源点:即图的起点. 汇点:即图的终点. 容量:有向边(u,v)允许通过的最大流量. 增广路:一条合法的从源点流向汇点的路径. 网络流问题是在图上进行解决的,我们通常可以将 ...
- 网络流--最大流--POJ 1459 Power Network
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #incl ...
- POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)
POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Networ ...
- poj 1459 多源多汇点最大流
Sample Input 2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 ...
- 基于Zlib算法的流压缩、字符串压缩源码
原文:基于Zlib算法的流压缩.字符串压缩源码 Zlib.net官方源码demo中提供了压缩文件的源码算法.处于项目研发的需要,我需要对内存流进行压缩,由于zlib.net并无相关文字帮助只能自己看源 ...
- hdu2389二分图之Hopcroft Karp算法
You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
- Edmonds 开花算法
Edmonds 开花算法 input: 图G,匹配M,未饱和点u idea: 查找从 u 開始的 M-交错路径.对每一个顶点记录父亲节点. 发现花朵.则收缩. 维护 S 和 T.S 表示沿着已经饱和的 ...
- ASP.NET Core中使用漏桶算法限流
漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中.这里举两个例子: 1.目前家庭上网都会限制一个固定的带宽,比如100M.200M等,一栋楼有很多的用户 ...
随机推荐
- etcd介绍
etcd是一个开源的.分布式的键值对数据存储系统,提供共享配置.服务的注册和发现. etcd与zookeeper相比算是轻量级系统.etcd的raft比zookeeper的paxos简单. 我们用et ...
- Outlook 2010中263邮箱客户端设置
Outlook 2010中263邮箱客户端设置 1.首次添加电子邮箱账户:打开outlook,在账户设置和服务中分别选择:“手动配置服务器设置或其他服务器类型”,“Internet电子邮件” 2.在i ...
- Day03 知识点
一.单行注释与多行注释 # 用来标记不运行的程序 pycharm 快捷键 ctrl+/ 可以在程序上方 也可以在程序后面 (PEP8) 多行注释 用三引号,一般推荐三双引号来做注释. 二.数据类型 ( ...
- 第五章:引用类型(一)-Object和Array
引用类型 引用类型的值(对象)是引用类型的一个实例 引用类型是一种数据结构,用于将数据与功能组织在一起 也常被称为类, Object 对象的两种创建方式 使用new操作符 对象字面量表示法 Array ...
- 谨慎使用多线程中的fork 学习!!!!
前言 在单核时代,大家所编写的程序都是单进程/单线程程序.随着计算机硬件技术的发展,进入了多核时代后,为了降低响应时间,重复充分利用多核cpu的资源,使用多进程编程的手段逐渐被人们接受和掌握.然而因为 ...
- webstorm 常见问题
1.webstorm(10.0.2)的端口号修改 https://blog.csdn.net/m0_38082783/article/details/71079274 2.导入主题 file –> ...
- maya 安装失败
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- git使用笔记-提高篇
一.分支.合并 1.合并一个特定提交 a specific commit git cherry-pick commit-id 把commit-id代表的本次提交合并到当前分支,如果有冲突需要解决后,提 ...
- Solaris常用命令
目录: 1.man <要查的命令名字> 2.ls 相当于DOS的dir3.clear 相当于DOS的cls,清除屏幕上的内容4.mkdir <目录名> 相当于DOS的md,新建 ...
- 浅入分析Linux
Linux 操作系统必须完成的两个主要目的 与硬件部分交互, 为包含在硬件平台上的所有底层可编程部件提供服务 为运行在计算机系统上的应用程序(即所谓的用户空间)提供执行环境 一些操作系统运行所有的用户 ...