增广路的核心就是引入了反向边,使在进行道路探索选择的时候增加了类似于退路的东西【有一点dp的味道??】

具体操作就是:1、首先使用结构体以及数组链表next[ MAXN ]进行边信息的存储

2、【核心】在存储正向边时,将正向边结构体数组相邻编号的元素存储反向边

  【具体操作:如正向边为AA[0],则对应的反向边为AA[1],这样就可以在之后通过异或来对正向边对应的反向边进行更新】【初始时反向边的容量为0】

3、通过dfs进行寻路,寻路过程要用数组记录下来路经过的边的编号,便于在找到终点后遍历找边的最小剩余容量,然后在总流量上加上最小的剩余容量即可

4、【易错】dfs应该写成bool 型的,在找到一条路或找不到路之后直接return【而不是一直dfs到最后】,而且要在主函数中加一个for(;;),在bool dfs 返回值为false时跳出循环即可

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10000+10
#define M 10000+10
#define inf 1e9;
using namespace std;
int head[N],arnum=,used[N],ans,way[M];
struct ss{int next,to,cap;}a[M];
void add(int from,int to,int cap){a[++arnum]=(ss){head[from],to,cap};head[from]=arnum;}
void insert(int u,int v,int cap){add(u,v,cap),add(v,u,);}
int n,m,S,T;
void work(int step)
{
int minn=inf;
for(int i=;i<=step;i++)
minn=min(minn,a[way[i]].cap);
ans+=minn;
for(int i=;i<=step;i++)
{
a[way[i]].cap-=minn;
a[way[i]^].cap+=minn;
}
}
int dfs(int u,int step)
{
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].to;
int cap=a[i].cap;
if(not used[v] and cap>)
{
way[step]=i;
used[v]=;
if(v==T){work(step);return ;}
else if(dfs(v,step+))return ;
}
return ;
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&S,&T);
int u,v,c;
for(int i=;i<=m;i++){scanf("%d%d%d",&u,&v,&c);insert(u,v,c);}
for(;;)
{
memset(used,,sizeof(used));
used[S]=;
if(not dfs(S,))break;
}
printf("%d",ans);
return ;
}

网络流初步:<最大流>——核心(增广路算法)(模板)的更多相关文章

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

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

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

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

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

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

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

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

  5. 网络流初步——增广路算法(EK)模板

    #include <iostream> #include <queue> #include<string.h> using namespace std; #defi ...

  6. 网络最大流最短增广路Dinic算法模板

    #include<cstdio> #include<cstring> #include<string> #include<cmath> #include ...

  7. 落谷p3376 最大流EdmondsKarp增广路模板

    参考: https://blog.csdn.net/txl199106/article/details/64441994 分析: 该算法是用bfs求出是否有路从s到t, 然后建立反向边(关于反向边), ...

  8. 网络流——增广路算法(dinic)模板 [BeiJing2006]狼抓兔子

    #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #in ...

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

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

随机推荐

  1. 机器学习 Numpy库入门

    2017-06-28 13:56:25 Numpy 提供了一个强大的N维数组对象ndarray,提供了线性代数,傅里叶变换和随机数生成等的基本功能,可以说Numpy是Scipy,Pandas等科学计算 ...

  2. codeforces 559a//Gerald's Hexagon// Codeforces Round #313(Div. 1)

    题意:面积是sqrt(3)/4的多少倍? 做延长线 #pragma comment(linker,"/STACK:1024000000,1024000000") #include& ...

  3. PHP函数总结 (一)

    <?php /** * 原理: * 函数不调用不执行,定义函数时,会将 * 函数放到内存中代码段,当调用函数时去内存 * 中函数名称所在位置中执行函数体,执行完后 * 将控制权移交回给调用函数的 ...

  4. python-day33--进程间通信(IPC)

    方式:队列(推荐使用) 一.基本情况 1.可以往队列里放任意类型的数据 2. 队列:先进先出 3. q=Queue(3) #可以设置队列中最多可以进入多少个值,也可以不设置 q.put('first' ...

  5. .NET 性能优化方法总结==转

    .NET 性能优化方法总结 目录 目录 1. C#语言方面... 4 1.1 垃圾回收... 4 1.1.1 避免不必要的对象创建... 4 1.1.2 不要使用空析构函数 ★... 4 1.1.3 ...

  6. ActiveMQ (一):安装启动及测试

    1. 预备知识 1.1 JMS JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范.<百科> 1.2 JMX JMX(Java M ...

  7. PHP:第四章——PHP数组处理函数

    <pre> <?php //数组处理函数 header("Content-Type:text/html;charset=utf-8"); //compact(); ...

  8. hadoop mongodb install(3)

    reference:http://dblab.xmu.edu.cn/blog/868-2/ root@iZuf68496ttdogcxs22w6sZ:~# mv mongodb-linux-x86_6 ...

  9. react中为什么要使用immutable

    因为在react中,react的生命周期中的setState()之后的shouldComponentUpdate()阶段默认返回true,所以会造成本组件和子组件的多余的render,重新生成virt ...

  10. 去除 DBGridEh SelectedRows里无效的书签

    数据集处于过滤状态,然后选中几个记录,再修改了这些记录中的某个字段(和过滤条件有关),导致那几个记录不符合过滤条件,不显示了.但是SelectedRows里 还保存着.如果不删除SelectedRow ...