fbpx
维基百科

埃德蒙兹-卡普算法

计算机科学中,埃德蒙兹-卡普算法通过实现福特-富尔克森算法来计算网络中的最大流,其时间复杂度为。该算法由叶菲姆·迪尼茨在1970年最先提出,并由杰克·埃德蒙兹和理察德·卡普在1972年独立发表。[1]

C++實作

以下是关于埃德蒙兹-卡普算法的C++语言描述:

struct Main {  struct Edge {  int u, v, Capacity, Flow;  Edge (int u, int v, int Capacity, int Flow) :  u(u), v(v), Capacity(Capacity), Flow(Flow) {}  };  struct Edmonds_Karp {  vector<Edge> Edges;  vector<int> Graph[MAXN]; // 保存下标  int n, Augment[MAXN], Previous[MAXN];  // 当起点到 Augment[i] 的可改进量;  void Initialise(int n)  {  for (int i = 0; i < n; ++i)  G[i].clear();  Edges.clear();  }  void Add(int u, int v, int Capacity)  {  Edges.push_back(Edge(u, v, Capacity, 0));  Edges.push_back(Edge(v, u, 0, 0));  int m = Edges.size() - 1;  Graph[u].push_back(m - 1);  Graph[v].push_back(m);  }  };  int MaxFlow(int s, int t)  {  int FlowSum = 0;  while (1) {  memset(Augment, 0, sizeof Augment);  queue<int> Travel;  Travel.push(s);  Augment[s] = INT_MAX;  while (!Travel.empty()) {  int From = Travel.front();  Travel.pop();  for (int i = 0; i < Graph[From].size(); ++i) {  Edge &Temp = Edges[Graph[From][i]];  if (!Augment[Temp.v] && Temp.Capacity > Temp.Flow) {  Previous[Temp.v] = Graph[From][i];  Augment[Temp.v] = min(Augment[From], Temp.Capacity - Temp.Flow);  Travel.push(Temp.v);  }  }  if (Augment[t]) break;  }  if (!Augment[t]) break;  for (int i = t; i != s; i = Edges[Previous[i]].From) {  Edges[Previous[i]].Flow += Augment[t];  Edges[Previous[i] ^ 1].Flow -= Augment[t];  }  FlowSum += Augment[t];  }  return flow;  }  Main(void) {} }; 

参考资料

  1. ^ Edmonds, Jack; Karp, Richard M. Theoretical improvements in algorithmic efficiency for network flow problems. Journal of the ACM (Association for Computing Machinery). 1972, 19 (2): 248–264. doi:10.1145/321694.321699 (英语). 

参见

埃德蒙兹, 卡普算法, 此條目需要擴充, 2015年11月12日, 请協助改善这篇條目, 更進一步的信息可能會在討論頁或扩充请求中找到, 请在擴充條目後將此模板移除, 计算机科学中, 通过实现福特, 富尔克森算法来计算网络中的最大流, 其时间复杂度为o, displaystyle, 该算法由叶菲姆, 迪尼茨在1970年最先提出, 并由杰克, 埃德蒙兹和理察德, 卡普在1972年独立发表, 實作, 编辑以下是关于的c, 语言描述, struct, main, struct, edge, capacity, flow,. 此條目需要擴充 2015年11月12日 请協助改善这篇條目 更進一步的信息可能會在討論頁或扩充请求中找到 请在擴充條目後將此模板移除 计算机科学中 埃德蒙兹 卡普算法通过实现福特 富尔克森算法来计算网络中的最大流 其时间复杂度为O V E 2 displaystyle O VE 2 该算法由叶菲姆 迪尼茨在1970年最先提出 并由杰克 埃德蒙兹和理察德 卡普在1972年独立发表 1 C 實作 编辑以下是关于埃德蒙兹 卡普算法的C 语言描述 struct Main struct Edge int u v Capacity Flow Edge int u int v int Capacity int Flow u u v v Capacity Capacity Flow Flow struct Edmonds Karp vector lt Edge gt Edges vector lt int gt Graph MAXN 保存下标 int n Augment MAXN Previous MAXN 当起点到 Augment i 的可改进量 void Initialise int n for int i 0 i lt n i G i clear Edges clear void Add int u int v int Capacity Edges push back Edge u v Capacity 0 Edges push back Edge v u 0 0 int m Edges size 1 Graph u push back m 1 Graph v push back m int MaxFlow int s int t int FlowSum 0 while 1 memset Augment 0 sizeof Augment queue lt int gt Travel Travel push s Augment s INT MAX while Travel empty int From Travel front Travel pop for int i 0 i lt Graph From size i Edge amp Temp Edges Graph From i if Augment Temp v amp amp Temp Capacity gt Temp Flow Previous Temp v Graph From i Augment Temp v min Augment From Temp Capacity Temp Flow Travel push Temp v if Augment t break if Augment t break for int i t i s i Edges Previous i From Edges Previous i Flow Augment t Edges Previous i 1 Flow Augment t FlowSum Augment t return flow Main void 参考资料 编辑 Edmonds Jack Karp Richard M Theoretical improvements in algorithmic efficiency for network flow problems Journal of the ACM Association for Computing Machinery 1972 19 2 248 264 doi 10 1145 321694 321699 英语 参见 编辑福特 富尔克森算法 迪尼茨算法 网络流 取自 https zh wikipedia org w index php title 埃德蒙兹 卡普算法 amp oldid 69519657, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。