題意:給出乙個無向圖,每條邊代表兩點之間的同行速度,給出起點和終點,求出從起點到終點的路徑的最小速度差。若無法從起點到終點,則輸出-1。
思路:儲存每條邊的資訊,按速度公升序排序。按速度從小到大列舉邊,然後依次往構建的樹中新增邊直到起點和終點在同一集合中。此時,最初新增的邊的速度與最後新增的邊的速度差為當前構造的路徑的速度差,每次列舉結束後更新速度差。第一次列舉結束後若發現無法從起點到達終點,那麼可以直接停止列舉。(第一次無法成功時,所有邊均已新增到路徑中,之後無論如何列舉也不可能構造出從起點到達終點的路徑)**從形式上來看很像kruskal,但並沒有構建出最小生成樹。所以我覺得真要分類的話,分到並查集中或許會好一些。(本來kruskal就依靠並查集實現)
#includeusingnamespace
std;
const
int inf = 0x3f3f3f3f
;int n, m, pa[205
];struct
edge
eg[1005
];bool
cmp(edge a, edge b)
void
init()
int fnd(int
x)void uni(int x,int
y)int
main()
int ans =inf;
scanf("%d
",&q);
sort(eg,eg+m,cmp); //
將邊按速度公升序排序
while (q--)
if (ans==inf) break;
//可以結束列舉
}
if (ans == inf) printf("
-1\n");
else printf("
%d\n
",ans);}}
return0;
}
HDU 1598 (列舉 並查集)
xx星有許多城市,城市之間通過一種奇怪的高速公路sars super air roam structure 超級空中漫遊結構 進行交流,每條sars都對行駛在上面的flycar限制了固定的speed,同時xx星人對 flycar的 舒適度 有特殊要求,即乘坐過程中最高速度與最低速度的差越小乘坐越舒服...
HDU1598 並查集 或 二分 DFS
題意 求從s到t的所有路線中最大邊權與最小邊權差值的最小值。方法一 並查集 貪心 將邊按照邊權從小到大排序,然後依次選取邊作為從s到t路線的最小邊,然後再按照邊權從小到大不斷加邊,直到s t聯通,則最後加的邊的邊權與最小邊權的差是答案的乙個可能解。對最小邊依次列舉,答案為所有可能解的最小值。incl...
hdu 1598 解題報告
說實話,一看到這個題,我第一反應就是dfs,本來想用dfs搜尋每乙個可行的路徑,然後記錄每乙個可行路徑上的最小速度差,然後再找出最小。可是寫著寫著就寫不下去了,因為記錄路徑實在不會。在網上看別人的方法,才恍然大悟,原來並查集是可以的。好乙個經典的演算法啊。思路 就是先按速度由小到大排序,然後在合併不...