最大流算法.在有向图上运行的算法.在出现算法介绍之前,先给出了各种概念.残余网络,增广路径,割.实现很直观,用到了广度优先搜索.O(VE)的运行时间.
算法的分析与证明我没有关注,呵呵.
// Edmonds-Karp.cpp
#include "stdafx.h"
#include "graph.h"
#include <iostream>
#include <vector>
using std ::vector ;
typedef int T ;
const int Size = 6 ;
int _tmain(int argc, _TCHAR* argv[])
{
vector<T> indexAdjoinsTo ;
vector<T> residualFlowAdjoinsTo ;
Graph<T> g(Size) ;
indexAdjoinsTo.push_back(1) ;
indexAdjoinsTo.push_back(2) ;
residualFlowAdjoinsTo.push_back(16) ;
residualFlowAdjoinsTo.push_back(13) ;
g.importAVertex(indexAdjoinsTo, residualFlowAdjoinsTo) ; // 0
indexAdjoinsTo.clear() ;
residualFlowAdjoinsTo.clear() ;
indexAdjoinsTo.push_back(2) ;
indexAdjoinsTo.push_back(3) ;
residualFlowAdjoinsTo.push_back(10) ;
residualFlowAdjoinsTo.push_back(12) ;
g.importAVertex(indexAdjoinsTo, residualFlowAdjoinsTo) ; // 1
indexAdjoinsTo.clear() ;
residualFlowAdjoinsTo.clear() ;
indexAdjoinsTo.push_back(1) ;
indexAdjoinsTo.push_back(4) ;
residualFlowAdjoinsTo.push_back(4) ;
residualFlowAdjoinsTo.push_back(14) ;
g.importAVertex(indexAdjoinsTo, residualFlowAdjoinsTo) ; // 2
indexAdjoinsTo.clear() ;
residualFlowAdjoinsTo.clear() ;
indexAdjoinsTo.push_back(2) ;
indexAdjoinsTo.push_back(5) ;
residualFlowAdjoinsTo.push_back(9) ;
residualFlowAdjoinsTo.push_back(20) ;
g.importAVertex(indexAdjoinsTo, residualFlowAdjoinsTo) ; // 3
indexAdjoinsTo.clear() ;
residualFlowAdjoinsTo.clear() ;
indexAdjoinsTo.push_back(3) ;
indexAdjoinsTo.push_back(5) ;
residualFlowAdjoinsTo.push_back(7) ;
residualFlowAdjoinsTo.push_back(4) ;
g.importAVertex(indexAdjoinsTo, residualFlowAdjoinsTo) ; // 4
indexAdjoinsTo.clear() ;
residualFlowAdjoinsTo.clear() ;
g.importAVertex(indexAdjoinsTo, residualFlowAdjoinsTo) ; // 5
g.calculateMaxFlow() ;
std ::cout << g.maxFlow() ;
std ::cout << std ::endl ;
g.printEveryFlow() ;
std ::cin.get() ;
return 0 ;
}