poj 3469 最大流 最小割 SAP演算法模板

2021-07-13 03:48:41 字數 2035 閱讀 9433

題目:

題意:有雙核處理器,有n個任務,給出每個任務在分別在兩個處理核心上工作的花費,然後有m行,每行給出兩個任務,如果兩個任務不在同乙個處理核心上工作,那麼將有額外的花費。求最小花費

思路:最小割。之前用dinic演算法做的,加上當前弧優化6000ms。省賽的時候yjj看到我的最大流板子是 dinic,說到你怎麼用這個板子,很容易被卡,學點更快的演算法吧。於是回來就學了sap演算法,加當前弧和gap優化,果然更快,2800ms。貼個板子,以備後用

模板一:

這個板子稍微快了一點點。。。但是**長了很多,因為多了乙個bfs函式

#include #include #include #include using namespace std;

const int n = 20100;

const int inf = 0x3f3f3f3f;

struct edge

g[n*100];

int level[n], cur[n], head[n], que[n], pre[n], gap[n];

int n, m, cnt, nv;

void add_edge(int v, int u, int cap)

void bfs(int t) //從匯點出發反向搜尋給為每個點確定距離標號,即每個點到匯點需要經過的最少邊數,gap陣列儲存相同標號的點數}}

}int sap(int s, int t)

aug = inf;

}break;}}

if(flag) continue;

int minlevel = nv;

for(int i = head[v]; i != -1; i = g[i].next) //尋找與當前點相連線的點中最小的距離標號

if(--gap[level[v]] == 0) break; //更新gap陣列後如果出現斷層,則源點匯點之間必定無流,直接退出

level[v] = minlevel + 1; //更新距離標號

gap[level[v]]++;

v = pre[v]; //轉當前點的前驅節點繼續尋找允許弧

}return flow;

}int main()

for(int i = 0; i < m; i++)

nv = n + 2;

printf("%d\n", sap(0, n + 1));

}return 0;

}

模板二:

沒有bfs函式,初始所有點的距離標號為0,在增廣過程中維護距離標號

#include #include #include #include using namespace std;

const int n = 20100;

const int inf = 0x3f3f3f3f;

struct edge

g[n*100];

int level[n], cur[n], head[n], que[n], pre[n], gap[n];

int n, m, cnt, nv;

void add_edge(int v, int u, int cap)

int sap(int s, int t)

aug = inf;

}break;}}

if(flag) continue;

int minlevel = nv;

for(int i = head[v]; i != -1; i = g[i].next)

if(--gap[level[v]] == 0) break;

level[v] = minlevel + 1;

gap[level[v]]++;

v = pre[v];

}return flow;

}int main()

for(int i = 0; i < m; i++)

nv = n + 2;

printf("%d\n", sap(0, n + 1));

}return 0;

}

poj 3469 最大流 最小割

題意是說有兩個cpu,現在給你n個模組,每個模組必須在兩個cpu其中的乙個中執行,給出每個模組在不同cpu中執行的耗費,並且如果兩個不在同乙個cpu執行的模組之間要交換資料的話需要額外的耗費.解法 建立超級源點 s,超級匯點 t 並對各個點拆點建立邊 s,i,ai 和 i n,t,bi i,i n,...

最大流 最小割

真是不知道該說些什麼呀 感覺這是我見到過的網上敘述最最最詳細的乙個演算法了。可見我才學過幾個演算法qwq 我並不認為我能比網上講的要好 所以 emmm 我就打算解釋一下 不要管這迷一樣的邏輯 先去看看題解hhh 咳咳 等會兒 好了好了 qwq 言歸正傳 這裡的dinic演算法,是對edmonds k...

最小割最大流記錄

經過一系列的學習,明白了一些東西記錄一下備忘 割 是指刪除一些邊,使剩下的網路中沒有增光路,那麼可以得出max flow c s,t 割 為什麼呢?首先我們明白知道最大流一定是根據增光路得到i的,那麼割就是包含增光路的乙個集合,那麼sum c s,t 一定是在在這個 基礎上得到的,也就是割中一定包含...