/*
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 上的...