最大流問題預流推進演算法(BFS優化)

2021-08-02 15:16:09 字數 1543 閱讀 6976

/*

name: 最大流問題預流推進演算法

author: 巧若拙

date: 14-06-17 09:26

description: 改進的預流推進演算法,有如下優化:

進行了預先逆序bfs分層,

利用結點鍊錶,每次都是從高度最大的結點開始處理.

*/#include#include using namespace std;

typedef struct vertexnode vertexnode;

const int maxv=2000; //最大頂點數量

const int maxe=2000; //最大邊數量

const int infinity = 0x7fffffff; //無窮大

int capacity[maxv][maxv]; //記錄殘流網路的容量

int flow[maxv]; //標記當前節點的剩餘流量

int dis[maxv]; //標記節點所在的層次

vertexnode *head; //儲存頂點表結點資訊

int maxflow_relabel_to_front(int src, int des, int n) ;

bool bfs(int src, int des, int n); //廣度優先搜尋構造分層網路

void check(int u, int n); //對頂點u進行預流推進或重新標號操作,直到其剩餘流量為0

int main()

fcin >> n >> m;

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

fcin >> capacity[u][v];

}

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

for (int i=0; i0)

}} //沒有可以push的頂點,執行relabel

if (relabel)

}dis[u] = minlevel + 1;

printf("relabel %d height to %d\n", u, dis[u]);

} }

}

int maxflow_relabel_to_front(int src, int des, int n)

}

vertexnode *pre = head;

while (pre->next)

pre = pre->next; //檢視下乙個結點} }

p = head->next;

while (p)

return flow[des];

}

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

}

return true;

}

最大流問題預流推進演算法(最基本)

name 最大流問題預流推進演算法 author 巧若拙 date 14 06 17 09 26 description 最基本的預流推進演算法,沒有任何優化,每次遍歷所有的結點,找出活結點,尋找可行弧,並預流推進,若沒有可以push的頂點,執行relabel操作。include include u...

網路最大流演算法 最高標號預流推進HLPP

這個演算法。怎麼說.學來也就是裝裝13吧。長得比ek醜 跑的比ek慢 寫著比ek難 大家先來猜一下這個演算法的思想吧 joy 看看人家的名字 最高標號預留推進 多麼高階大氣上檔次2333333咳咳 從它的名字中我們可以看出,它的核心思想是 推進,而不是找增廣路 那麼它是怎麼實現推進的呢?很簡單,我們...

網路流一 最大流EK演算法(bfs)

poj 1273 網路流最大流ek演算法 時間複雜度上限為nm 2 include include include include using namespace std define maxn 0x7fffffff int n,m int gra 210 210 int pre 210 int f...