/*
Time:2015-6-18
接触网络流好几天了
写的第一个模版————Ford-Fulkerson算法
作用:求解网络最大流
注意:源点是0 汇点是1 如果题目输入的是1到n 请预处理减1
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std; const int INF = 0x7fffffff;//无穷大
const int maxn = + ;//这里可以设置结点的数量
int n, m;
int flag[maxn], pre[maxn], alpha[maxn];
int c[maxn][maxn], f[maxn][maxn];
queue<int>Q; int main()
{
int i, j, u, v, cc, ff;
scanf("%d%d", &n, &m);
for (i = ; i<n; i++) for (j = ; j<n; j++) c[i][j] = INF, f[i][j] = INF; //初始化不存在弧
for (i = ; i<m; i++)
{
scanf("%d%d%d%d", &u, &v, &cc, &ff);//输入弧的起点,弧的终点,弧的容量,弧的流量 //解决重边问题
if (c[u][v] == INF) { c[u][v] = cc; f[u][v] = ff; }
else { c[u][v] += cc; f[u][v] += ff; }
}
//0是源点 n-1汇点
int startt, endd;
startt = ;
endd = n - ;
while ()
{
while (!Q.empty()) Q.pop();
memset(flag, -, sizeof(flag));
memset(pre, -, sizeof(pre));
memset(alpha, -, sizeof(alpha));
flag[startt] = ;//源点已标号 但是未检查邻接顶点
pre[startt] = ;//源点从自己推过来
alpha[startt] = INF;//源点可以发出INF的流量
Q.push(startt);
while ((!Q.empty()) && flag[endd] == -)
{
int h = Q.front(); Q.pop();
for (i = ; i<n; i++)
{
//前向弧
if (c[h][i] != INF)//有路
{
if (f[h][i]<c[h][i])//不饱和
{
if (flag[i] == -)//i顶点未标号
{
flag[i] = ;//i顶点已标号 但是未检查邻接顶点
pre[i] = h;//i从h推过来
//alpha[i]取决于alpha[h]与c[h][i]-f[h][i]的较小值
if (c[h][i] - f[h][i] <= alpha[h]) alpha[i] = c[h][i] - f[h][i];
else alpha[i] = alpha[h];
Q.push(i);//i顶点进入队列 等待检查邻接顶点
}
}
}
//后向弧
if (c[i][h] != INF)//有路
{
if (f[i][h]>)//非零流弧
{
if (flag[i] == -)//i顶点未标号
{
flag[i] = ;//i顶点已标号 但是未检查邻接顶点
pre[i] = -h;//i从h推过来 标号为- 意思是后向弧
//alpha[i]取决于alpha[h]与f[i][h]的较小值
if (alpha[h] <= f[i][h]) alpha[i] = alpha[h];
else alpha[i] = f[i][h];
Q.push(i);//i顶点进入队列 等待检查邻接顶点
}
}
}
}
flag[h] = ;//h顶点已标号,并且已经检查所有的邻接顶点
}
if (flag[endd] == - || alpha[endd] == ) break; //已经不存在增广路,不再寻找
int a = alpha[endd];//可改进量
int now = endd;
while ()
{
if (now == ) break;
if (pre[now] >= )
{
f[pre[now]][now] += a;
now = pre[now];
}
else if (pre[now]<)
{
f[now][-pre[now]] -= a;
now = -pre[now];
}
} }
for (i = ; i<n; i++)
for (j = ; j<n; j++)
if (f[i][j] != INF)
printf("%d --> %d : %d\n", i, j, f[i][j]);
int maxflow = ;
for (i = ; i<n; i++) if (f[][i] != INF) maxflow += f[][i];
printf("maxflow = %d\n", maxflow);
return ;
}

一般增广路方法求网络最大流(Ford-Fulkerson算法)的更多相关文章

  1. PIGS POJ - 1149网络流(最短增广路---广搜) + 建图

    题意: 第一行输入m和n,m是猪圈的数量,n是顾客的数量,下面n行 第 i+1行表示第i个顾客 , 输入第一个数字表示有几把猪圈的钥匙,后面输入对应的猪圈,最后一个数字输入顾客想买几头猪. 建图: 设 ...

  2. POJ-1273-Drainage Ditches 朴素增广路

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 70588   Accepted: 2743 ...

  3. hdu 3549 Flow Problem【最大流增广路入门模板题】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...

  4. 【Luogu】P3381最小费用最大流模板(SPFA找增广路)

    题目链接 哈  学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...

  5. hdu 3549 Flow Problem(增广路算法)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 模板题,白书上的代码... #include <iostream> #include & ...

  6. Power Network (最大流增广路算法模板题)

    Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20754   Accepted: 10872 Description A p ...

  7. HDU3549 Flow Problem(网络流增广路算法)

    题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...

  8. 网络流初步:<最大流>——核心(增广路算法)(模板)

    增广路的核心就是引入了反向边,使在进行道路探索选择的时候增加了类似于退路的东西[有一点dp的味道??] 具体操作就是:1.首先使用结构体以及数组链表next[ MAXN ]进行边信息的存储 2.[核心 ...

  9. POJ 1459 Power Network(网络最大流,dinic算法模板题)

    题意:给出n,np,nc,m,n为节点数,np为发电站数,nc为用电厂数,m为边的个数.      接下来给出m个数据(u,v)z,表示w(u,v)允许传输的最大电力为z:np个数据(u)z,表示发电 ...

随机推荐

  1. JAVA 代码开发规范

    一.开发工具规范: 1. 开发工具经项目负责人调试后统一确定. 2. 开发工具一经确定不允许集成任何非统一插件,若有需要,经项目负责人同意后统一为 项目组成员添加. 3. 开发工具的编码格式不允许修改 ...

  2. saltstack布署实践 【安装】

    借用链接http://www.cnblogs.com/liuyansheng/p/6094122.html的安装方式,我再同步一下其它操作系统的安装方式,由原Docker官网拷贝 Ubuntu1404 ...

  3. Linux控制脚本:信号捕捉,作业控制,调整谦让度,以及计划任务

    1.关于信号以及信号捕捉 (1) $ ps  -au可以用来查看所有作业,包括暂停的和停止的,当然还有正在运行的. 在STAT这一列表示各个作业的状态,S表示Stop,R表示Run,T表示被追踪的或停 ...

  4. CodeForces 415D Mashmokh and ACM

    $dp$. 记$dp[i][j]$表示已经放了$i$个数字,并且第$i$个数字放了$j$的方案数.那么$dp[i][j] = \sum\limits_{k|j}^{}  {dp[i - 1][k]}$ ...

  5. js实现浏览器通知功能

    概述 Notification API是浏览器的通知接口,用于在用户的桌面(而不是网页上)显示通知信息,桌面电脑和手机都适用,比如通知用户收到了一封Email.具体的实现形式由浏览器自行部署,对于手机 ...

  6. [DP之多重背包优化方法]

    首先我们看一道有趣的题目 然后这道题很快想到是一个多重背包和无限背包混合体 那么我们就以这道题 来讨论一下多重背包的优化 首先我们看看朴素打法 memset(F,,]=; ;i<=N;i++) ...

  7. SQL2008无法连接到.,及sa登录失败的总结

    尊重别人的劳动成果,我是转载别人的: 本文转载自- 红黑联盟http://www.2cto.com/database/201203/123089.html 出现问题 : 标题: 连接到服务器----- ...

  8. maven之(六)setting.xml的配置文件详解

    setting.xml配置文件 maven的配置文件settings.xml存在于两个地方: 1.安装的地方:${M2_HOME}/conf/settings.xml 2.用户的目录:${user.h ...

  9. C# 语言规范_版本5.0 (第21章 附录C_参考资料)

    A. 参考资料 Unicode 联合会.The Unicode Standard, Version 3.0(Unicode 标准 3.0 版).Addison-Wesley,Reading,Massa ...

  10. 记JavaScript的入门学习(一)

    2016年11月20日算是每天都会利用点时间去思考,去学习,接下来便是我学习JavaScript的前前后后,希望早日学完JavaScript和jQuery 之前学校毕业设计选择了一个如下图的题目 希望 ...