网络流——增广路算法(dinic)模板

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdio>
 6 #include<queue>
 7 using namespace std;
 8 struct data
 9 {
10     int from,to,next,cup,flow;
11     data(){from=-1,to=-1,next=-1,cup=-1,flow=-1;}
12 }e[200];
13 int cnt=0,head[200],head1[200];
14 int dis[200];
15 bool vis[200];
16 void add(int u,int v,int w){e[cnt].from=u,e[cnt].to=v,e[cnt].next=head[u],head[u]=cnt,e[cnt].cup=w,e[cnt].flow=0;cnt++;}
17 int s,t;
18 bool bfs()
19 {
20     memset(vis,0,sizeof(vis));
21     memset(dis,0,sizeof(dis));
22     int f=2147483647;
23     queue<int> q;
24     q.push(s);
25     vis[s]=1;
26     dis[s]=0;
27     while(!q.empty())
28     {
29         int n=q.front();
30         q.pop();
31         for(int i=head[n];i>=0;i=e[i].next)
32         {
33             if(!vis[e[i].to]&&e[i].cup>e[i].flow)
34             {
35                 vis[e[i].to]=1;
36                 dis[e[i].to]=dis[n]+1;
37                 q.push(e[i].to);
38             }
39         }
40     }
41     return vis[t];
42 }
43 int dfs(int n,int a)
44 {
45     if(n==t||a==0) return a;
46     int flow=0,f;
47     for(int i=head1[n];i>=0;i=e[i].next)
48     {
49         head1[n]=e[i].next;
50         if(dis[e[i].to]==dis[n]+1&&(f=dfs(e[i].to,min(a,e[i].cup-e[i].flow)))>0)
51         {
52             e[i].flow+=f;
53             e[i^1].flow-=f;
54             flow+=f;
55             a-=f;
56             if(a==0) break;
57         }
58     }
59     return flow;
60 }
61 int dinic()
62 {
63     int sum=0;
64     while(bfs())
65     {
66         for(int i=1;i<=t;i++)head1[i]=head[i];
67         sum+=dfs(s,2147483647);
68     }
69     return sum;
70 }
71 int main()
72 {
73     memset(head,-1,sizeof(head));
74     int n,m;
75     scanf("%d%d",&n,&m);
76     for(int i=1;i<=m;i++)
77     {
78         int s,t,w;
79         scanf("%d%d%d",&s,&t,&w);
80         add(s,t,w);
81         add(t,s,0);
82     }
83     s=1,t=n;
84     printf("%d",dinic());
85 }

时间: 2024-11-03 05:30:03

网络流——增广路算法(dinic)模板的相关文章

最大网络流——增广路算法

几句废话:读了刘汝佳的书之后,感觉一切都是那么茫然,于是自己在网上找教程,自己一点点码的,大概用了三天.网络流基础:看来我很有必要说一下网络流的基础网络流问题就是给你一个图,每个图的边权叫做这条边的流量,问你从起始点出发,有多少值能通过这些边流到重点我知道你没看懂,举个例子: 如图: 最大值为 从1到2到4运6个 从1到2到3到4运1个 从1到3到4运3个 一共运10个. 举例说完了,那么我说几个定义: 容量,就只一条边的权值,表示能从这条边运送的最大值 流量,表示一条边实际上流过的最大值 那么

最大流——增广路算法

关于网络流的增广路算法,网上有很多详细介绍,这里是摘录的模板.详细请见:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html 1 #include<iostream> 2 #include<iomanip> 3 #include<ctime> 4 #include<climits> 5 #include<algorithm> 6 #include<queue>

关于最短增广路算法和连续最短增广路算法的操作步骤

最短增广路算法(SAP): 1.初始化容量网络和网络流: 2.构造残留网络和层次网络,如果汇点不在层次网络中,则算法结束: 3.在层次网络中不断用BFS增广,直到层次网络中没有增广路为止:每次增广完毕,在层次网络中要去掉因改进流量而导致饱和的弧: 4.转到步骤(2). 连续最短增广路算法(Dinic): 1.初始化容量网络和网络流: 2.构造残留网络和层次网络,如果汇点不在层次网络中,则算法结束: 3.在层次网络中用一次DFS过程进行增广,DFS执行完毕,该阶段的增广也执行完毕: 4.转到步骤(

Power Network(最大流基础_增广路算法:多源多汇,自建总源点和总汇点)

 Power NetworkCrawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description A power network consists of nodes (power stations, consumers and dispatchers) connected by p

Drainage Ditches(最大流基础_增广路算法)

 Drainage DitchesCrawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover p

增广路算法

#include<queue> #include<cstdio> #include<iostream> #include<cstring> using namespace std; const int maxn = 20; const int INF = (1<<30); int cap[maxn][maxn],flow[maxn][maxn];//cap记录容量,flow记录流量 int m; //弧的数量 int EdmondsKarp(in

网络流之 最短增广路算法模板(SAP)

数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,w,分别表示这条弧的起点,终点,容量.顶点序号从0开始. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <string&g

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

1 #include <iostream> 2 #include <queue> 3 #include<string.h> 4 using namespace std; 5 #define arraysize 201 6 int maxData = 0x7fffffff; 7 int a[222][222]; 8 int flow[222]; 9 int pre[222]; 10 int n,m; 11 queue<int> q; 12 int BFS(in

网络流 之 一般增广路算法 标号法实现

数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,c,f,分别表示这条弧的起点,终点,容量和流量.顶点序号从0开始. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <str