給定一個有向圖,求最小路徑覆蓋數。根據圖論定理,DAG 的最小路徑覆蓋數等於節點數減去最大匹配數。本題需先用 Floyd-Warshall 算法求傳遞閉包,再構造二分圖跑最大匹配(匈牙利算法)。
n、邊數 m。line[u][v],跑 Floyd 算法得到傳遞閉包:line[j][k] = line[j][k] || (line[j][i] && line[i][k])。line[u][v] == 1 則連邊 u -> v。MaxMatch。n - MaxMatch()。void floyd() {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
if (line[j][i] && line[i][k])
line[j][k] = 1;
}
bool get_path(int u) {
for (int i = 1; i <= n; i++)
if (line[u][i] && !used[i]) {
used[i] = 1;
if (mac[i] == -1 || get_path(mac[i])) {
mac[i] = u;
return true;
}
}
return false;
}
int MaxMatch() {
int num = 0;
memset(mac, -1, sizeof(mac));
for (int i = 1; i <= n; i++) {
memset(used, 0, sizeof(used));
if (get_path(i)) num++;
}
return num;
}
n=0, m=0 結束。O(n^3),匈牙利 O(n*m),n ≤ 500 可接受。