网络流初步——增广路算法(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(int s,int t)
13 {
14     int i,j;
15     while(!q.empty())
16         q.pop();
17     for(i=1;i<m+1;i++)
18     {
19         pre[i]=-1;
20     }
21     pre[s]=0;
22     flow[s]= maxData;
23     q.push(s);
24     while(!q.empty())
25     {
26         int index=q.front();
27         q.pop();
28         if(index==t)
29             break;
30         for(i=1;i<m+1;++i)
31         {
32             if(i!=s && a[index][i]>0 && pre[i]==-1)
33             {
34                  pre[i]=index;
35                  flow[i]=min(a[index][i],flow[index]);
36                  q.push(i);
37             }
38         }
39     }
40     if(pre[t]==-1)
41         return -1;
42     else
43         return flow[t];
44 }
45 int ek(int s,int t)
46 {
47     int increasement=0;
48     int sumflow=0;
49     while((increasement=BFS(s,t))!=-1)
50     {
51          int k=t;
52          while(k!=s)
53          {
54               int last=pre[k];
55               a[last][k]-=increasement;
56               a[k][last]+=increasement;
57               k = last;
58          }
59          sumflow+=increasement;
60     }
61     return sumflow;
62 }
63 int main()
64 {
65     int i,j;
66     int start,end,ci;
67     cin>>n>>m;
68     memset(a,0,sizeof(a));
69     memset(flow,0,sizeof(flow));
70     for(i=0;i<n;i++)
71     {
72         cin>>start>>end>>ci;
73         a[start][end]+=ci;
74     }
75     cout<<ek(1,m)<<endl;
76     return 0;
77 }

时间: 2024-08-26 08:29:31

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

网络流初步——增广路代码的分析

struct Edge { int from,to,flow,cap; Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){} }; struct EdmonsKarp() { int n,m; vector<Edge> edges; vector<int> G[maxn]; int a[maxn]; int p[maxn]; void init(int n){ for(int i=0;i<n;i++) G[i

最大流——增广路算法

关于网络流的增广路算法,网上有很多详细介绍,这里是摘录的模板.详细请见: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>

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

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

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

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

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

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

网络流之 最短增广路算法模板(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

网络流——增广路算法(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=-