最大網路流Dinic演算法(逆序廣搜構造分層網路)

2021-08-02 13:07:40 字數 2011 閱讀 2757

/* 

name: 最大網路流dinic演算法(逆序廣搜構造分層網路)

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()

fcin >> n >> m;

for(int i=0; i> u >> v;

fcin >> capacity[u][v];

}

cout << n << " " << m << endl;

for (int i=0; icout << endl;

} cout << maxflow_dinic(0, n-1, n) << endl;

system("pause");

return 0;

}

int maxflow_dinic(int src, int des, int n)

return sumflow;

}

int dfs(int src, int des, int n, int v)//深度優先搜尋尋找增廣路,返回節點v和其父節點所在邊的流量增量

else

}

}

}//不修改整條增廣路,只修改當前節點和其父節點所在邊的容量

capacity[pre[v]][v] -= inc;

capacity[v][pre[v]] += inc;

return inc; //返回節點v和其父節點所在邊的流量增量

}

bool bfs(int src, int des, int n)//逆向廣度優先搜尋構造分層網路,若不存在增廣路,則返回false

//匯點加入佇列

dis[des] = 1;

queue[rear++] = des;

while (front < rear) //佇列非空

queue[rear++] = i;

}

}

}

return false;

}

最大網路流演算法

最大網路流,需要的準備是 bfs,ek演算法 用pre陣列記錄前驅節點,用vis判斷是否訪問過 用g二維陣列表示殘餘網路,用f二維陣列表示實際流網路 下面這篇部落格詳細介紹了最大網路流 既然已經有了輪子,那我就不造了 下面是我的 include include include include usi...

最大網路流

求網路流有很多演算法,這幾天學習了兩種,記錄一下ek演算法。首先是網路流中的一些定義 v表示整個圖中的所有結點的集合.e表示整個圖中所有邊的集合.g v,e 表示整個圖.s表示網路的源點,t表示網路的匯點.對於每條邊 u,v 有乙個容量c u,v c u,v 0 如果c u,v 0,則表示 u,v ...

最大網路流

1 基本概念和術語 1 網路 g 是乙個簡單有向圖,g v,e v 在 v 中指定乙個頂點 s 稱為源 和另乙個頂點 t 稱為匯 有向圖 g 的每一條邊 v,w e 對應有乙個值 cap v,w 0 稱為邊的容量 這樣的有向圖 g 稱作乙個網路 2 網路流 網路上的流 是定義在網路的邊集合 e 上的...