題解:對於輸入的邊,我們首先按照速度從大到小排序,然後對於每一次詢問,st end 兩個城市,我們暴力列舉,
for(int i = 0; i < m; i ++) 然後我們從第 i 條邊開始(也就是說列舉刪除0~i條邊),到後面的第 m 條邊,我們用krustra,向並查集中插入每一條邊,看是不是能讓st 和 end 聯通,那麼現在的 加入的這條邊的速度 - 第i條邊的速度就是 當前列舉情況的最小差啦,,我們與ans 比較一下取小值就可以break,進入下一條邊的列舉啦。因為速度都是按小到大排序的,次條邊能讓st 和 end聯通,再加邊,只會讓速度差更大
上馬://187ms 300k
#include #include using namespace std;
#define max 205
#define inf 1<<30
int n,m,q;
struct edge
}//這裡表示,從第i第m條邊,都不能讓st 和end 聯通,那麼可以break
if(j == m)
}return ans;
}int main()
sort(edge,edge+m);
int ans;
int st,end;
cin >> q;
while (q--)
{cin >> st >> end;
ans = krustra(st,end);
if(ans == inf) cout << "-1" <
hdu 1598 解題報告
說實話,一看到這個題,我第一反應就是dfs,本來想用dfs搜尋每乙個可行的路徑,然後記錄每乙個可行路徑上的最小速度差,然後再找出最小。可是寫著寫著就寫不下去了,因為記錄路徑實在不會。在網上看別人的方法,才恍然大悟,原來並查集是可以的。好乙個經典的演算法啊。思路 就是先按速度由小到大排序,然後在合併不...
HDU1598 並查集 列舉
題意 給出乙個無向圖,每條邊代表兩點之間的同行速度,給出起點和終點,求出從起點到終點的路徑的最小速度差。若無法從起點到終點,則輸出 1。思路 儲存每條邊的資訊,按速度公升序排序。按速度從小到大列舉邊,然後依次往構建的樹中新增邊直到起點和終點在同一集合中。此時,最初新增的邊的速度與最後新增的邊的速度差...
HDU 1598 (列舉 並查集)
xx星有許多城市,城市之間通過一種奇怪的高速公路sars super air roam structure 超級空中漫遊結構 進行交流,每條sars都對行駛在上面的flycar限制了固定的speed,同時xx星人對 flycar的 舒適度 有特殊要求,即乘坐過程中最高速度與最低速度的差越小乘坐越舒服...