洛谷 P1186 瑪麗卡

2022-03-19 07:26:37 字數 1086 閱讀 9020

這道題題目真的想吐槽一下...是在機房同學的解釋下才看懂的。就是讓你求在可以刪一條邊的情況下,並且刪後保證可以到達終點時,求刪了後的最大的最短路徑。

70分暴力思路:

列舉刪邊,然後跑一下最短路即可,思路很簡單,下面給出70分**:

#include using namespace std;

vector> e[1010];

int n , m , ans;

int dis[1010] , vis[1010] , l[500010] , r[500010];

void work(int uu , int vv)

}} }

ans = max(ans , dis[n]);

}int main()

for(int i = 1; i <= m; i++) work(l[i] , r[i]); //刪除

cout << ans;

return 0;

}

100分滿分思路:

我們先預處理求一遍最短路,當我們開始刪邊時,如果刪的不是最短路徑上的邊時,那麼答案還是原來的最短路,因為我們最短路要用的邊一條沒變。所以,我們只需要列舉刪掉最短路上的邊即可,這樣答案一定改變,同時注意能達到終點。下面給出滿分**:

#include using namespace std;

vector> e[1010];

int n , m , ans;

int dis[1010] , vis[1010] , pre[1010];

void work(int uu , int vv)

}} }

ans = max(ans , dis[n]);

}void p_work()

}} }

ans = max(ans , dis[n]);

}int main()

p_work(); //預處理刪哪些邊

for(int i = n; i; i = pre[i]) work(i , pre[i]);

cout << ans;

return 0;

}

洛谷P1186瑪麗卡

先跑一遍最短路,將最短路的路徑記錄下來,然後列舉每一條最短路的邊,將其斷掉,記錄此時的1 n的時間,取其中最大的乙個時間即為所求。通過 cut 和 f 進行操作 注意這個題是個稠密圖,可能會卡 spfa 所以我用了堆優化 dijk include include include include in...

洛谷 P1186 瑪麗卡

麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路...

洛谷 P1186 瑪麗卡

麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路...