最大网络流Dinic算法(优化版)

/*
  Name: 最大网络流Dinic算法(优化版) 
  Copyright: 
  Author: 巧若拙 
  Date: 10-06-17 22:08
  Description: 优化的Dinic算法。
  先广度优先搜索分层网络,然后深度优先搜索增广路。
  每找到一条增广路,不修改整条增广路,只修改当前节点和其父节点所在边的容量,可以减少操作次数;
  标注不能通往汇点以形成增广路的节点是阻塞节点,下次不再访问它。
  上述两个优化可以减少重复修改容量和搜索操作。  
*/

#include  
#include 
  
using namespace std;  
  
const int MAXV=2000;   //最大顶点数量   
const int MAXE=2000;   //最大边数量  
const int INFINITY = 0x7fffffff;   //无穷大   
int capacity[MAXV][MAXV]; //记录残流网络的容量  
int flow[MAXV];  //标记从源点到当前节点实际还剩多少流量可用  
int pre[MAXV];  //标记在这条路径上当前节点的前驱,同时标记该节点是否在队列中  
int dis[MAXV]; //标记节点所在的层次 
int block[MAXV]; //标记节点是否为阻塞节点 
  
int MaxFlow_Dinic(int src, int des, int n);  
bool BFS(int src, int des, int n); //广度优先搜索构造分层网络  
int DFS(int src, int des, int n, int v);//深度优先搜索寻找增广路  
  
int main()  
{ 
    int  m, n, u, v;  
    ifstream fcin("maxflow.txt");
    
    if (!fcin.is_open())
    {
        cout << "Error opening file"; exit (1);
    }
  
    fcin >> n >> m;
   
    for(int i=0; i> u >> v;  
        fcin >> capacity[u][v];      
    }  
    
    cout << n << " " << m << endl;
    for (int i=0; i

你可能感兴趣的:(常用算法分析,图论)