P2136 拉近距離 題解

2022-09-19 17:48:15 字數 1138 閱讀 8797

題目傳送門

可能更好的閱讀體驗

對於乙個有向圖 \(g\):有 \(n\) 個點,\(m\) 個邊,把每一條邊用三元組 \((s_i,t_i,w_i)\),其中 \(s_i,t_i\) 表示兩個端點,\(w_i\) 表示這條邊的長度。

如果這個圖中從點 \(1\) 到點 \(n\) 的最短路可以無限縮小,請輸出forever love,否則輸出最短路長度。

通過資料範圍我們發現這題的最短路要處理負權

我們又可以發現這裡的最短路不一樣的地方在於,以前的最短路走一條邊加上邊的長度,這裡的最短路走一條邊減去一條邊的長度。所以在做最短路之前,我們要把所有的 \(w_i\) 都變成它的相反數(即乘上乙個 \(-1\))。

題目中要求輸出forever love的情況是最短路可以無限縮小,那顯然,只有在圖中有負權環的時候最短路才能無限縮小,所以我們的最短路演算法還要能找負權環。

能處理負權,還能找負權環並求出最短路的演算法只有 bellman-ford 符合我們的要求。這裡可以不用 spfa 進行優化,因為 \(o(mn)\) 的演算法可以跑過該題的資料範圍。

for(int i=1;i<=m;i++)

for(int i=1;i<=n;i++)

bellman-ford 演算法的建邊不使用鄰接表,而是使用三個陣列儲存起點,終點與邊的權值。

注意在開始的時候要將最短路陣列初始化成int_max(因此儲存最短路的陣列要開long long)。

d[1]=0;

for(int i=1;id[u[j]]+w[j]){

cout<<"forever love"為了避免出現負權環,我們再進行一次檢查,如果在求完最短路的情況下還有邊可以鬆弛,那就說明這個圖中不存在最短路(即存在負權環),直接輸出forever love

因為小明和小紅都有可能拉近距離,所以我們要再跑一次 \(n\) 到 \(1\) 的最短路

如果跑完兩次最短路確定圖內不含有負權環,那麼直接輸出 \(1\) 到 \(n\) 的最短路與 \(n\) 到 \(1\) 的最短路的較小值。

ac記錄

P2136 拉近距離

我也想有這樣的愛情故事,可惜我單身 其實這道題就是乙個比較裸的最短路問題。對於乙個三元組 s,w,t s其實就是乙個端點,而w就是到達的端點,連線兩個端點的邊長為 t,注意要取乙個相反數,這樣才能繼續跑最短路 那麼題意也就這麼看完了,就是很簡單的跑最短路嘛,小明是起點,小紅是終點,小明追小紅就完事了...

洛谷 P2136 拉近距離

我是源點,你是終點。我們之間有負權環。小明 在小明和小紅的生活中,有n個關鍵的節點。有m個事件,記為乙個三元組 si,ti,wi 表示從節點si有乙個事件可以轉移到ti,事件的效果就是使他們之間的距離減少wi。這些節點構成了乙個網路,其中節點1和n是特殊的,節點1代表小明,節點n代表小紅,其他代表進...

洛谷P2136 拉近距離(負環判定)

我是源點,你是終點。我們之間有負權環。小明 在小明和小紅的生活中,有 nnn 個關鍵的節點。有 mmm 個事件,記為乙個三元組 si,ti,wi s i,t i,w i si ti wi 表示從節點 sis isi 有乙個事件可以轉移到 tit iti 事件的效果就是使他們之間的距離減少 wiw i...