給定無向圖,邊有速度限制。路徑的「舒適度」定義為路徑上最大速度與最小速度之差。查詢多對城市間的最小舒適度差值。n ≤ 200, m ≤ 1000, Q ≤ 10。
最小差值路徑一定是某條「最小生成樹」類結構中的路徑。具體地,若將邊按速度排序,則最優路徑的最小邊與最大邊在排序序列中形成一個連續窗口。我們可以枚舉窗口左端點 i(作為最小速度),然後從 i 向右加入邊,直到起終點連通,此時右端點 j 對應的速度為最大速度,差值 speed[j]-speed[i] 為候選答案。取所有 i 的最小值。
(s,t):
INF。i = 0..m-1:
j = i..m-1:合併邊 j 的兩端點;若 find(s)==find(t),更新答案並 break。INF 輸出 -1,否則輸出答案。struct Edge { int u, v, w; } e[1100];
int fa[210];
int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); }
void unite(int x,int y) { fa[find(x)]=find(y); }
int solve(int s, int t) {
int ans = 0x3f3f3f3f;
for (int i=0; i
每查詢 O(m^2 α(n)),m≤1000, Q≤10,約 10^7 操作,完全可行。可優化:若 e[j].w - e[i].w ≥ ans 提前跳出內層循環。
HDU 1598 巧妙利用「排序後的連續窗口」性質,將最小差值路徑問題轉化為枚舉最小邊 + 並查集判連通。這是「最小瓶頸路徑」與「最小生成樹」思想的結合,極具啟發性。