題目:
題意:有雙核處理器,有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 一定是在在這個 基礎上得到的,也就是割中一定包含...