网络流--最大流ek模板

标准大白书式模板,代码简单但由于效率并不高,所以并不常用,就是这样

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 #include<vector>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxm=150+5;
 8 const int INF=0x3f3f3f3f;
 9
10 struct edge{
11     int from,to,c,f;
12     edge(int a,int b,int m,int n):from(a),to(b),c(m),f(n){}
13 };
14
15 struct ek{
16     int n,m;
17     vector<edge>e;
18     vector<int>g[maxm];
19     int a[maxm];
20     int p[maxm];
21
22     void init(int n){
23         for(int i=0;i<n+3;i++)g[i].clear();
24         e.clear();
25     }
26
27     void add(int from,int to,int c){
28         e.push_back(edge(from,to,c,0));
29         e.push_back(edge(to,from,0,0));
30         m=e.size();
31         g[from].push_back(m-2);
32         g[to].push_back(m-1);
33     }
34
35     int mf(int s,int t){
36         int f=0;
37         while(1){
38             memset(a,0,sizeof(a));
39             queue<int>q;
40             q.push(s);
41             a[s]=INF;
42             while(!q.empty()){
43                 int u=q.front();
44                 q.pop();
45                 for(int i=0;i<g[u].size();i++){
46                     edge tmp=e[g[u][i]];
47                     if(!a[tmp.to]&&tmp.c>tmp.f){
48                         p[tmp.to]=g[u][i];
49                         a[tmp.to]=min(a[u],tmp.c-tmp.f);
50                         q.push(tmp.to);
51                     }
52                 }
53                 if(a[t])break;
54             }
55             if(!a[t])break;
56             for(int i=t;i!=s;i=e[p[i]].from){
57                 e[p[i]].f+=a[t];
58                 e[p[i]^1].f-=a[t];
59
60             }
61             f+=a[t];
62         }
63         return f;
64     }
65 };
时间: 2024-10-26 09:35:58

网络流--最大流ek模板的相关文章

POJ1459-Power Network-网络流-最大流(EK模板题)

题目链接:http://poj.org/problem?id=1459 好吧,其实就是一道模板题... 但是写的那么长的鸟语...orz...各种揣度题目意思.... 造福一下大家,我把题目数据的意思说一下,就不用看这可恶的英文了... 题目意思:给几个发电站,给几个消耗站,再给几个转发点.发电站只发电,消耗站只消耗电,转发点只是转发电,再给各个传送线的传电能力.问你消耗站能获得的最多电是多少. 首先输入四个数据,分别表示节点数量,发电站的数量,消耗站的数量,以及转发点的数量. 接下来的是m个转

网络流--最大流dinic模板

标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 1 #include<stdio.h> //差不多要加这么些头文件 2 #include<string.h> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 const int maxm=150+5; //点的总数 8

排涝 网络流--最大流 ek算法

传送门: 以前没接触过最大流问题,刚开始以为是用kruscal算法求最小生成树呢,并且题上也是显示最小树的专题: 反正还行吧,捣鼓了两天,总算稍微理解了一下,等会回来整理一下知识点. 1 #include <iostream> 2 #include <queue> 3 #include <algorithm> 4 #include <cstring> 5 #include <cstdio> 6 using namespace std; 7 con

网络流-最大流 Dinic模板

1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define MP make_pair 6 #define PB push_back 7 #define ls first 8 #define rs second 9 typedef long long LL; 10 typedef pair<int,int> PII; 11 const double eps=1e-8; 12 const double pi=acos(

hdu 4289 Control(网络流 最大流+拆点)(模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1545    Accepted Submission(s): 677 Problem Description You, the head of Department o

HDU1532_Drainage Ditches(网络流/EK模板)

Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8599    Accepted Submission(s): 4005 Problem Description Every time it rains on Farmer John's fields, a pond forms over Bessie's

【转】网络最大流——EK算法详解

原文  http://blog.csdn.net/a1dark/article/details/11177907 EdmondsKarp算法,简称EK算法,O(m^2n) 因为是初学教程,所以我会尽量避免繁杂的数学公式和证明.也尽量给出了较为完整的代码.本文的目标群体是网络流的初学者,尤其是看了各种NB的教程也没看懂怎么求最大流的小盆友们.本文的目的是,解释基本的网络流模型,最基础的最大流求法,即bfs找增广路法,也就是EK法,全名是Edmond-Karp,其实我倒是觉得记一下算法的全名和来历可

HDU 1532 Drainage Ditches(最大流 EK算法)

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路: 网络流最大流的入门题,直接套模板即可~ 注意坑点是:有重边!!读数据的时候要用"+="替换"=". 对网络流不熟悉的,给一篇讲解:http://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html. ?(? ? ??)我是看这篇博客才入门的. 代码: 1 #include <cstdio> 2 #includ

【网络流最大流】poj3281Dining

/* EK算法版本的,比较慢哦.....详见下面dinic版本 ----------------------------------------- 题目是网络流最大流的问题 ---------------------------------------- 建图: 关键:拆点 把每个牛拆成两个点,牛作为一个点有流量限制,即每一头牛只能的一份饭. 把牛拆开后,将边的权值赋值为1, ---------------------------------------- 建好图后就可以EK算法最大流了 ---