首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDU 1598 最舒適路徑:並查集 + 邊排序枚舉

     編輯:關於C++

問題描述

給定無向圖,邊有速度限制。路徑的「舒適度」定義為路徑上最大速度與最小速度之差。查詢多對城市間的最小舒適度差值。n ≤ 200, m ≤ 1000, Q ≤ 10。

核心觀察

最小差值路徑一定是某條「最小生成樹」類結構中的路徑。具體地,若將邊按速度排序,則最優路徑的最小邊與最大邊在排序序列中形成一個連續窗口。我們可以枚舉窗口左端點 i(作為最小速度),然後從 i 向右加入邊,直到起終點連通,此時右端點 j 對應的速度為最大速度,差值 speed[j]-speed[i] 為候選答案。取所有 i 的最小值。

算法流程

  1. 邊按速度升序排序。
  2. 對每個查詢 (s,t):
    • 初始化答案 INF。
    • 對 i = 0..m-1:
      • 初始化並查集。
      • 對 j = i..m-1:合併邊 j 的兩端點;若 find(s)==find(t),更新答案並 break。
  3. 若答案仍為 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 巧妙利用「排序後的連續窗口」性質,將最小差值路徑問題轉化為枚舉最小邊 + 並查集判連通。這是「最小瓶頸路徑」與「最小生成樹」思想的結合,極具啟發性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved