网络流--最大流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 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 dinic{
16     int m,s,t;                    //边数、源点标号、汇点标号
17     vector<edge>e;        //边
18     vector<int>g[maxm];    //g[i][j]表示第i个点出发的第j条边在e中的编号
19     bool vis[maxm];
20     int d[maxm],cur[maxm];    //d为源点到点的距离,cur为当前遍历到的边
21     void init(int n){                初始化,n为点数量(标号0~n-1)
22         for(int i=0;i<n+5;i++)g[i].clear();
23         e.clear();
24     }
25     void add(int a,int b,int v){        //加入弧和反向弧
26         e.push_back(edge(a,b,v,0));    //正向弧容量v,反向弧容量0
27         e.push_back(edge(b,a,0,0));
28         m=e.size();
29         g[a].push_back(m-2);
30         g[b].push_back(m-1);
31     }
32     bool bfs(){
33         memset(vis,0,sizeof(vis));
34         queue<int>q;
35         q.push(s);
36         d[s]=0;
37         vis[s]=1;
38         while(!q.empty()){
39             int u=q.front();q.pop();
40             for(int i=0;i<g[u].size();i++){
41                 edge tmp=e[g[u][i]];
42                 if(!vis[tmp.to]&&tmp.c>tmp.f){
43                     vis[tmp.to]=1;
44                     d[tmp.to]=d[u]+1;
45                     q.push(tmp.to);
46                 }
47             }
48         }
49         return vis[t];
50     }
51     int dfs(int x,int a){
52         if(x==t||a==0)return a;
53         int flow=0,f;
54         for(int& i=cur[x];i<g[x].size();i++){
55             edge &tmp=e[g[x][i]];
56             if(d[x]+1==d[tmp.to]&&(f=dfs(tmp.to,min(a,tmp.c-tmp.f)))>0){
57                 tmp.f+=f;
58                 e[g[x][i]^1].f-=f;
59                 flow+=f;
60                 a-=f;
61                 if(a==0)break;
62             }
63         }
64         if(!flow)d[x]=-1;
65         return flow;
66     }
67     int mf(int s,int t){                在主函数中使用的函数,求s到t的最大流
68         this->s=s;
69         this->t=t;
70         int flow=0;
71         while(bfs()){
72             memset(cur,0,sizeof(cur));
73             flow+=dfs(s,INF);
74         }
75         return flow;
76     }
77 };
78     
时间: 2024-10-26 10:29:03

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

网络流-最大流 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(

POJ训练计划1459_Power Network(网络流最大流/Dinic)

解题报告 这题建模实在是好建,,,好贱,,, 给前向星给跪了,纯dinic的前向星竟然TLE,sad,,,回头看看优化,,, 矩阵跑过了,2A,sad,,, /************************************************************************* > File Name: PowerN.cpp > Author: _nplus > Mail: [email protected] > Time: 2014年07月19日 星期

[POJ 1273] Drainage Ditches &amp; 最大流Dinic模板

Drainage Ditches Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a

网络流最大流——dinic算法

前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问题简述 一个很普遍的例子就是--你家和自来水厂之间有许多中转站,中转站又由一些水管连接着.我们假设自来水厂的供水是无限的,并且中转站内能存储的水量也是无限的,但是管道有宽又窄,很显然管道内的流量必须小于等于管道的承载范围(否则管道就被撑爆了),那么问题就是要你求出你家最多能收到多大流量的水. emm

【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)

题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤20. 解法:这题的图转换得极妙!(*^▽^*)   我们可以发现找到的矩阵需要满足3个条件:1.N行M列:2.各行各列的和:3.各元素的大小.再仔细阅读一次题目,发现题目中提到的2个数字相同——“20”,再想想这是不是有什么玄机.     首先可以找到第3个条件的转化,可以用容量来限制,那么这题用

UESTC 1143 数据传输 网络流 最大流 Dinic

数据传输 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status 机房里面有m台电脑,n台网线,每条网线都每秒中最多传送的数据量,如今须要你计算从标号为1的电脑传送数据到编号为m的电脑,问一秒内 最多传送多少数据? Input 第1行: 两个用空格分开的整数N(0≤N≤200)和 M(2≤M≤200).N网线的数量,M是电脑的数量. 第二行到第N+1行:

最大流Dinic模板

1 int bfs() 2 { 3 queue<int>q; 4 memset(d,0,sizeof(d)); 5 d[1]=1; 6 q.push(1); 7 while (!q.empty()) 8 { 9 int u=q.front(); 10 q.pop(); 11 for (int i=head[u];i!=-1;i=eage[i].next) 12 { 13 int v=eage[i].v; 14 if (!d[v]&&eage[i].cap>0) 15 {

网络流--最大流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

网络最大流dinic模板

#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; queue<int>q; int INF=1e9; int n,m,head[10005],cur[10005],ct=1,s,t,d[10005],ans; struct N{ int to,next,w; }edge[200005]; void add(int x