这里只是用来存放模板,几乎没有讲解,要看讲解网上应该很多吧……

ek

bfs不停寻找增广路到找不到为止,找到终点时用pre回溯,O(VE^2)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
int cap[][], pre[], n, m, a[];
int bfs(){
queue<int> q;
q.push();
memset(a,,sizeof(a));
a[] = INF;
while(!q.empty()){
int front = q.front();
q.pop();
for(int i = ;i<=m;i++){
if(!a[i] && cap[front][i]){
a[i] = min(a[front], cap[front][i]);
pre[i] = front;
q.push(i);
}
}
}
return a[m];
}
int ek(){
int ans = ;
while(bfs()){
ans += a[m];
for(int i = m;i!=;i = pre[i]){
cap[pre[i]][i] -= a[m];
cap[i][pre[i]] += a[m];
}
}
return ans;
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(cap,,sizeof(cap));
for(int i = ;i<=n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
cap[u][v] += w;
}
printf("%d\n",ek());
}
return ;
}

dinic

反复构造层次网络加找增广路,优势在于当某点的流入量较大时,可以一次完成多条增广路的累加,O(V^2E)

记得初始化lv,cnt=1

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = ;
const int INF = 0x3f3f3f3f;
struct EDGE{
int to, next, cap, flow;
EDGE(){}
EDGE(int a, int b, int c, int d){
to = a, next = b, cap = c, flow = d;;
}
}e[];
int head[], cnt, lv[],m ,n;
void add(int from, int to, int cap){
e[++cnt] = EDGE(to, head[from], cap, );
head[from] = cnt;
e[++cnt] = EDGE(from, head[to], , );
head[to] = cnt;
}
int bfs(){
queue<int> q;
q.push();
memset(lv,,sizeof(lv));
lv[] = ;
while(!q.empty()){
int front = q.front();
q.pop();
for(int i = head[front];i;i = e[i].next){
int to = e[i].to;
if(!lv[to] && e[i].cap-e[i].flow){
lv[to] = lv[front]+;
q.push(to);
}
}
}
return lv[m];
}
int dfs(int now, int a){
int flow = ,f;
if(now == m) return a;
for(int i = head[now];i;i = e[i].next){
int to = e[i].to;
if(lv[to] == lv[now]+ && (f = dfs(to,min(a,e[i].cap-e[i].flow)))){
e[i].flow += f;
e[i^].flow -= f;
flow += f;
a -= f;
if(!a) break;
}
}
return flow;
}
int dinic(){
int ans = ;
while(bfs()){
ans += dfs(,INF);
}
return ans;
}
int main(){
while(~scanf("%d%d",&n,&m)){
cnt = ;
memset(head,,sizeof(head));
for(int i = ;i<=n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
printf("%d\n",dinic());
}
return ;
}

网络流dinic ek模板 poj1273的更多相关文章

  1. 网络流Dinic算法模板 POJ1273

    这就是以后我的板子啦~~~ #include <queue> #include <cstdio> #include <cstring> #include <a ...

  2. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  3. Drainage Ditches(POJ1273+网络流+Dinic+EK)

    题目链接:poj.org/problem?id=1273 题目: 题意:求最大流. 思路:测板子题,分别用Dinic和EK实现(我的板子跑得时间均为0ms). Dinic代码实现如下: #includ ...

  4. POJ 3281 [网络流dinic算法模板]

    题意: 农场主有f种食物,d种饮料,n头牛. 接下来的n行每行第一个数代表第i头牛喜欢吃的食物数量,和第i头牛喜欢喝的饮料数目. 接下来分别是喜欢的食物和饮料的编号. 求解:农场主最多能保证几头牛同时 ...

  5. HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))

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

  6. 网络流小记(EK&dinic&当前弧优化&费用流)

    欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...

  7. POJ 1273 Drainage Ditches (网络流Dinic模板)

    Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...

  8. HDU1532最大流 Edmonds-Karp,Dinic算法 模板

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

  9. POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]

    妖怪题目,做到现在:2017/8/19 - 1:41…… 不过想想还是值得的,至少邻接矩阵型的Dinic算法模板get√ 题目链接:http://poj.org/problem?id=1815 Tim ...

随机推荐

  1. LeetCode_125. Valid Palindrome

    125. Valid Palindrome Easy Given a string, determine if it is a palindrome, considering only alphanu ...

  2. Masonry详解

    - (void)viewDidLoad { [super viewDidLoad]; //1.view1 居中显示 UIView *view1 = [[UIView alloc]init]; view ...

  3. SQL Server 2008中的代码安全===主密钥

    在SQL Server中的加密由层次结构形式进行处理以提供多级别的安全.SQL Server包含两个用于加密数据的密钥类型.如下图: 1.服务器主密钥(Service Master Key),位于层次 ...

  4. 第十八章 并发登录人数控制——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 在某些项目中可能会遇到如每个账户同时只能有一个人登录或几个人同时登录,如果同时有多人登录:要么不让后者登录:要么踢出前者登录(强制退出).比如spring securi ...

  5. 用gcd库函数求最大公约数

    如何直接调用库函数来求最大公约数呢? 1.首先看怎样求两个数的最大公约数 要注意gcd()前面是两个“_” !!! #include<bits/stdc++.h> using namesp ...

  6. linux自由软件安装 ./config, make的理解 -- ongoing

    在linux系统中安装软件的其中一种:源码安装的方法是,先输入./configure,然后输入make,最后make install.或许有人留意到没有,这些软件的根目录中开始是没有Makefile的 ...

  7. Git使用两个用户名两个公钥链接同一个Git服务器

    同篇文章以Gitee举例, 支持国产, 首先关联一下我的另外一篇文章: 在码云上添加公钥时提示不允许重复添加(实际上当前公钥数为0) 在这篇文章中, 我后续有补充解释为什么会出现我之前没有弄明白的这个 ...

  8. [转帖]Pivotal Greenplum 6.0 新特性介绍

    Pivotal Greenplum 6.0 新特性介绍 https://cloud.tencent.com/developer/news/391063 原来 greenplum 也是基于pg研发的. ...

  9. java积累的细节问题

    一.将几个数字进行拼接,拼接成字符串 一定要将""放到几个数字之前,否则就会把数字相加之后的数转化成字符串 如你需要拼接年份,月份,和日 如果:2018+12+13+"& ...

  10. go struct 的方法1

    方法 Go 没有类.然而,仍然可以在结构体类型上定义方法. 方法接收者 出现在 func 关键字和方法名之间的参数中. package main import (     "fmt" ...