题目链接: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)的更多相关文章

  1. 最大流算法之Ford-Fulkerson算法与Edmonds–Karp算法

    引子 曾经很多次看过最大流的模板,基础概念什么的也看了很多遍.也曾经用过强者同学的板子,然而却一直不会网络流.虽然曾经尝试过写,然而即使最简单的一种算法也没有写成功过,然后对着强者大神的代码一点一点的 ...

  2. 网络流(一)——Edmonds Karp算法

    首先是一些关于网络流的术语: 源点:即图的起点. 汇点:即图的终点. 容量:有向边(u,v)允许通过的最大流量. 增广路:一条合法的从源点流向汇点的路径. 网络流问题是在图上进行解决的,我们通常可以将 ...

  3. 网络流--最大流--POJ 1459 Power Network

    #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #incl ...

  4. 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 ...

  5. 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 ...

  6. 基于Zlib算法的流压缩、字符串压缩源码

    原文:基于Zlib算法的流压缩.字符串压缩源码 Zlib.net官方源码demo中提供了压缩文件的源码算法.处于项目研发的需要,我需要对内存流进行压缩,由于zlib.net并无相关文字帮助只能自己看源 ...

  7. 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 ...

  8. Edmonds 开花算法

    Edmonds 开花算法 input: 图G,匹配M,未饱和点u idea: 查找从 u 開始的 M-交错路径.对每一个顶点记录父亲节点. 发现花朵.则收缩. 维护 S 和 T.S 表示沿着已经饱和的 ...

  9. ASP.NET Core中使用漏桶算法限流

    漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中.这里举两个例子: 1.目前家庭上网都会限制一个固定的带宽,比如100M.200M等,一栋楼有很多的用户 ...

随机推荐

  1. WireShark抓包分析(二)

    简述:本文介绍了抓包数据含义,有TCP报文.Http报文.DNS报文.如有错误,欢迎指正. 1.TCP报文 TCP:(TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP ...

  2. php rtrim的一个坑,很“二”的问题

    一.背景: 做项目的时候遇到一种情况,商家的营业时间显示的问题,设计图上要求显示成:“星期一,星期二,星期三,星期四,星期五,星期六,星期天” 换句话说,就是营业星期勾哪个就显示哪个,类似下面这样: ...

  3. java课后思考问题(二)

    1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. import java.math.BigInteger; public class Suijishu public stati ...

  4. python--upload file into HDFS 加载文件到HDFS

    模拟:https://creativedata.atlassian.net/wiki/spaces/SAP/pages/61177860/Python+-+Read+Write+files+from+ ...

  5. 转 Python 多进程multiprocessing.Process之satrt()和join()

    1. https://blog.csdn.net/wonengguwozai/article/details/80325745 今天项目中涉及到了使用多进程处理数据,在廖雪峰的python教程上学习了 ...

  6. MyCnblog Style

    以下内容添加到页脚HTML代码处 <style> #leftmenu ul { display: none; } .cnblogs-markdown pre code, .cnblogs- ...

  7. Linux下Tomcat启动关闭命令

    1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 2.查看Tomcat是否以关闭 ps -ef|grep tomcat 如果显示以下信息,说明Tomcat还没 ...

  8. [转]将input file的选择的文件清空

    本文转自:http://hi.baidu.com/xiongshihu/item/125c79b47632e794194697f5 上传文件时,选择了文件后想清空文件路径的两种办法: JS代码 < ...

  9. 工作空间造成的javaweb项目无法新建

    出现问题: 当我打开myeclipse开发工具将原有的已经存在的一个名为jeecms的项目删除的时候,出现了删除不了,因此我采取了强制的删除的方法,最终项目删除了.接下来新建同名的javaweb就出现 ...

  10. java的wait/notify小结

    wait()是使线程停止运行,而notify使停止的线程继续运行 wait()锁释放与notify()锁不释放 当线程呈wait状态时,调用线程对象的interrupt()方法会出现异常 带一个参数的 ...