//这个是邻接矩阵的
#include<iostream>
#include<queue>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=;
const int inf=0x3f3f3f;
int N;
int depth[maxn];
int a[maxn][maxn];
bool bfs(int s,int e)//广搜求深度
{
queue<int>q;
memset(depth,-,sizeof(depth));//初始-1
depth[s]=;
q.push(s);
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=;i<=N;i++)
{
if(depth[i]==-&&a[now][i])//两点有路,并且未搜过
{
depth[i]=depth[now]+;
q.push(i);
}
}
}
return depth[e]>;
}
int dfs(int now,int e,int nowflow)
{
if(now==N) return nowflow;//如果搜到最后 int findflow=;
for(int i=;i<=N;i++)
{
if(a[now][i]&&depth[i]==depth[now]+)//有路,并且为下一节点
{
findflow=dfs(i,e,min(nowflow,a[now][i]));//继续dfs
if(findflow)
{
a[now][i]-=findflow;
a[i][now]+=findflow;
return findflow;
}
}
}
if(!findflow) depth[now]=-;//炸点优化
return false;
}
int dinic(int s,int e)
{
int maxflow=;
while(bfs(s,e))
maxflow+=dfs(s,e,<<); return maxflow;
}

链式前向星

没听说过的同学 戳这里

#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f;
const int maxn = 1e5+;
struct node{
int v,w,next;
node(int v1=,int w1=,int next1=):v(v1),w(w1),next(next1){}
};
node e[maxn<<];
int head[maxn];
int tot;
int N,E;//顶点数和边数
int dep[maxn];//求深度
int cur[maxn]//当前弧优化
void init()
{
tot=;
memset(head,-,sizeof(head));
}
void add(int u,int v,int w)
{
e[tot].v=v;
e[tot].w=w;
e[tot].next=head[u];
head[u]=tot++;
//反向边
e[tot].v=u;
e[tot].w=;
e[tot].next=head[v];
head[v]=tot++;
}
//bfs分层图
bool bfs(int ss,int ee)
{
memset(dep,-,sizeof(dep));
queue<int>q;
dep[ss]=;
q.push(ss);
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=head[now];i!=-;i=e[i].next)
{
if(dep[e[i].v]==- && e[i].w>)
{
dep[e[i].v]=dep[now]+;
q.push(e[i].v);
}
}
}
return dep[ee]!=-;
}
//dfs搜索增广路径,now搜索顶点 ee终点 nowflow当前最大流
int dfs(int now,int ee,int nowflow)
{
// 搜索到终点或者 最大流为0
if(now==ee||nowflow==) return nowflow;
//useflow 可用流量 达到nowflow时不再增加
//maxflow 递归深搜时的最大流
int useflow=,maxflow;
//&i=cur[now] 为cur[now]起了个别名,为当前弧优化,每次更新cur[now];
for(int &i=cur[now]; i != - ; i = e[i].next)
{
if(e[i].w > && dep[e[i].v] == dep[now] + )
{
maxflow = dfs(e[i].v, ee, min(nowflow-useflow, e[i].w));
if(maxflow>)
{
e[i].w-=maxflow;
e[i^].w+=maxflow;
useflow+=maxflow;
if(uswflow == nowflow) return nowflow;
}
}
}
if(!useflow) dep[now]=-;
return useflow;
}
int dinic(int ss,int ee)
{
int ans=;
while(bfs(ss,ee))
{
for(int i=;i<=N;i++)
cur[i]=head[i];
ans+=dfs(ss,ee,inf);
}
return ans;
}

网络流dinic模板,邻接矩阵+链式前向星的更多相关文章

  1. 【模板】链式前向星+spfa

    洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...

  2. 模板 Dijkstra+链式前向星+堆优化(非原创)

    我们首先来看一下什么是前向星.   前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...

  3. poj-1459-最大流dinic+链式前向星-isap+bfs+stack

    title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...

  4. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  5. 图的存储结构:邻接矩阵(邻接表)&链式前向星

    [概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...

  6. zzuli 2131 Can Win dinic+链式前向星(难点:抽象出网络模型+建边)

    2131: Can Win Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 431  Solved: 50 SubmitStatusWeb Board ...

  7. 三种邻接表存图模板:vector邻接表、数组邻接表、链式前向星

    vector邻接表: ; struct Edge{ int u,v,w; Edge(int _u=0,int _v=0,int _w=0){u=_u,v=_v,w=_w;} }; vector< ...

  8. hdu2647 逆拓扑,链式前向星。

    pid=2647">原文地址 题目分析 题意 老板发工资,可是要保证发的工资数满足每一个人的期望,比方A期望工资大于B,仅仅需比B多1元钱就可以.老板发的最低工资为888元.输出老板最 ...

  9. HDU1532 Drainage Ditches SAP+链式前向星

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

随机推荐

  1. js如何将一个json数组对应放置到另一数组中去

    需要将上面这个数组的每一个元素对应添加至下面的数组中 最后合成为这样的数组: 使用for循环,将第一个数组中的元素循环到第二个数组中

  2. DDL-常见的约束

    一.常见的约束NOT NULL:非空,该字段的值必填UNIQUE:唯一,该字段的值不可重复DEFAULT:默认,该字段的值不用手动插入有默认值CHECK:检查,mysql不支持PRIMARY KEY: ...

  3. [iOS]被忽略的main函数

    如同任何基于C的应用程序,程序启动的主入口点为iOS应用程序的main函数.在iOS应用程序,main函数的作用是很少的.它的主要工作是控制UIKit framework.因此,你在Xcode中创建任 ...

  4. navicat mysql 存储过程

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. 一.基本数据类型:略 二.变量: 自定义变量:DECLARE   a INT ; SET a=100; 可用以 ...

  5. Oracle之plsql及游标

    --1.赋值 --:= 赋值 declare var_name ) :='&请输入名字';--&是一个提示输入的特殊符号,会打开一个输入框 var_age ) :='&请输入年 ...

  6. Hadoop源码学习笔记之NameNode启动场景流程三:FSNamesystem初始化源码剖析

    上篇内容分析了http server的启动代码,这篇文章继续从initialize()方法中按执行顺序进行分析.内容还是分为三大块: 一.源码调用关系分析 二.伪代码执行流程 三.代码图解 一.源码调 ...

  7. Linux学习-计算机基础

    Linux 学习-计算机基础 一.描述计算机的组成及其功能. 计算机系统是由硬件(Hardware)和软件(Software )两部分组成. 硬件: 从硬件基本结构上来讲,计算机是由运算器.控制器.存 ...

  8. Ruby中区分运行来源的方法(转)

    Ruby中区分运行来源的方法 这篇文章主要介绍了Ruby中区分运行来源的方法,本文讲解的是类似Python中的if name == 'main':效果,其实Ruby中也有类似语法,需要的朋友可以参考下 ...

  9. Centos7最小化安装之工作站设置

    Centos7最小化安装之工作站设置 实测在Vultr的VPS上正常可用 在Vultr上怎么看桌面 两种解决方法: 使用VNC远程连接 直接使用Vultr的view console功能 我使用的是第二 ...

  10. 一些有趣的 Shell 命令

    find . -name "*.db" -type f 查找当前路径下名称满足正则*.db的文件,-type d 则是查找文件夹 grep -rn "Main" ...