全網都是矩陣快速冪,我只會倍增dp
其實這題與 acwing 345. 牛站 還是比較像的,那題可以矩陣快速冪 / 倍增,這題也行。
先 \(floyd\) 預處理兩點之間不用魔法最短距離 \(d_\) 複雜度 \(o(n^3)\)
然後預處理兩點之間至多用乙個魔法的最短距離 \(w_\),初始為 \(w_ = d_\),列舉 \(i, j\) 和一條邊 \((u, v, t)\)
\(w_ = \min(d[i][u] - t + d[v][j])\),複雜度 \(o(n^2m)\)
然後把 \(w\) 陣列當做鄰接矩陣的新圖,所以問題變成了走恰好 \(k\) 條邊的最短路(可以理解多走不會變差,因為滿足 \(w_ <= 0\)),這個問題就是 acwing 345. 牛站 ,具體做法看 acwing 345. 牛站的倍增 dp 思路,複雜度 \(o(n^3 \log k)\)
注意細節,走 \(0\) 條邊的最短路是 \(d_\),注意 \(f\) 的初始值。
#include #include #include #include using namespace std;
typedef long long ll;
const int n = 105, m = 2505, l = 20;
const ll inf = 1e18;
int n, m, k, l;
ll d[n][n], w[n][n], g[l][n][n], f[n], t[n];
struct e e[m];
int main()
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
for (int i = 1; i <= n; i++)
} for (int c = 1; c <= l; c++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
g[c][i][j] = min(g[c][i][j], g[c - 1][i][k] + g[c - 1][k][j]);
for (int i = 1; i <= n; i++) f[i] = d[1][i];
for (int c = 0; c <= l; c++)
} printf("%lld\n", f[n]);
return 0;
}
NOI Online 1 入門組 文具訂購
description 小明的班上共有 n 元班費,同學們準備使用班費集體購買 3 種物品 圓規,每個 7 元。筆,每支 4 元。筆記本,每本 3 元。小明負責訂購文具,設圓規,筆,筆記本的訂購數量分別為 a,b,c,他訂購的原則依次如下 n元錢必須正好用光,即 7a 4b 3c n。在滿足以上條件...
NOI Online 1 提高組 序列
luogu p6185 noi online 1 序列 將其轉化為圖論題。定義 u,v 為 a i 所代表的點 u v 為 b i 所代表的點 對於操作 2 將其視為一種權值搬運的操作,從 u 到 v 或者反過來轉移點權。那麼我們對 u,v 和 u v 連一條無向邊,顯然對於乙個連通塊內的所有點都可...
NOI Online 1 提高組 氣泡排序
這個題很繞,記數字i前面有cns i 個數字比他大,逆序對個數就是sigmi cns i 反轉k次就是讓cns i k i 1 i n 而且cns i 不能有負數 利用兩個線段樹維護一下,就是有點繞。include include include include includeusing names...