HDU 1598 (列舉 並查集)

2021-08-02 20:34:14 字數 1200 閱讀 8039

xx星有許多城市,城市之間通過一種奇怪的高速公路sars(super air roam structure---超級空中漫遊結構)進行交流,每條sars都對行駛在上面的flycar限制了固定的speed,同時xx星人對 flycar的「舒適度」有特殊要求,即乘坐過程中最高速度與最低速度的差越小乘坐越舒服 ,(理解為sars的限速要求,flycar必須瞬間提速/降速,痛苦呀 ), 

但xx星人對時間卻沒那麼多要求。要你找出一條城市間的最舒適的路徑。(sars是雙向的)。 

input

輸入包括多個測試例項,每個例項包括: 

第一行有2個正整數n (1

output

每個尋路要求列印一行,僅輸出乙個非負整數表示最佳路線的舒適度最高速與最低速的差。如果起點和終點不能到達,那麼輸出-1。

sample input

4 4

1 2 2

2 3 4

1 4 1

3 4 2

21 3

1 2

sample output

1

0

題目大意:讓求乙個點到另乙個點的速度差值最小的那條路,輸出最小差值,如果不存在輸出-1.

因為q<11,所以一開始想起了用最短路來解決兩點之間的問題,用max[ ],min[ ],ans[ ]記錄每個點距源點的最大速度和最小速度,最小差值,利用每個點的速度之差來更新三個陣列。但是可能遇到的一種情況是:當前差值最小的max[i]和min[x]不一定是最終所要找的那條路,因為後面的邊權還不確定。

可以用列舉+並查集來做,先把邊從小到大排列,然後列舉相鄰的邊 i~j ,如果它們能使s和t連通,那麼差值就是edge[j].w - edge[i].w,找到符合條件的最小值。

#include#include#include#define n 1010

using namespace std;

struct node

edge[n];

int pre[210],s,t,n;

void init()

bool cmp(node a,node b)

int find(int x)

int main()

{ int m,q;

while(~scanf("%d",&n))

{scanf("%d",&m);

for(int i = 0;i

HDU1598 並查集 列舉

題意 給出乙個無向圖,每條邊代表兩點之間的同行速度,給出起點和終點,求出從起點到終點的路徑的最小速度差。若無法從起點到終點,則輸出 1。思路 儲存每條邊的資訊,按速度公升序排序。按速度從小到大列舉邊,然後依次往構建的樹中新增邊直到起點和終點在同一集合中。此時,最初新增的邊的速度與最後新增的邊的速度差...

hdu 1598 列舉 最小生成樹

本題要求一條通路中,最高速與最低速的差值最小。這樣的題與求最小生成樹的題的求法完全不一樣了。為了保證通路中差值最小,應先對權值從小到大排序,然後遍歷所有的點進行查詢。起點的位置逐漸變大 保證每個點都遍歷 而只要所求的兩點連通,立刻break,以保證差值最小。include stdio.h inclu...

HDU1598 並查集 或 二分 DFS

題意 求從s到t的所有路線中最大邊權與最小邊權差值的最小值。方法一 並查集 貪心 將邊按照邊權從小到大排序,然後依次選取邊作為從s到t路線的最小邊,然後再按照邊權從小到大不斷加邊,直到s t聯通,則最後加的邊的邊權與最小邊權的差是答案的乙個可能解。對最小邊依次列舉,答案為所有可能解的最小值。incl...