洛谷 P1186 瑪麗卡

2022-05-15 09:17:23 字數 1434 閱讀 3677

麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。

因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。

在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。

麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路正在維修,從瑪麗卡所在的城市都能到達麥克所在的城市。

瑪麗卡將只從不堵車的路上通過,並且她將按最短路線行車。麥克希望知道在最糟糕的情況下瑪麗卡到達他所在的城市需要多長時間,這樣他就能保證他的女朋友離開該城市足夠遠。

編寫程式,幫助麥克找出瑪麗卡按最短路線通過不堵車道路到達他所在城市所需的最長時間(用分鐘表示)。

輸入格式:

第一行有兩個用空格隔開的數n和m,分別表示城市的數量以及城市間道路的數量。1≤n≤1000,1≤m≤n*(n-1)/2。城市用數字1至n標識,麥克在城市1中,瑪麗卡在城市n中。

接下來的m行中每行包含三個用空格隔開的數a,b和v。其中1≤a,b≤n,1≤v≤1000。這些數字表示在a和城市b中間有一條雙行道,並且在v分鐘內是就能通過。

輸出格式:

輸出檔案的第一行中寫出用分鐘表示的最長時間,在這段時間中,無論哪條路在堵車,瑪麗卡應該能夠到達麥克處,如果少於這個時間的話,則必定存在一條路,該條路一旦堵車,瑪麗卡就不能夠趕到麥克處。

輸入樣例#1:

5 7

1 2 8

1 4 10

2 3 9

2 4 10

2 5 1

3 4 7

3 5 10

輸出樣例#1:

27

堆優化的dijkstra

#include#define pair pair#define maxn 1000+10

#define maxm 600000+1

using

namespace

std;

intn,m,num,head[maxn],s,t,pre[maxn],dis[maxn],v[maxm];

intbian[maxm],ans;

struct

edgeedge[maxm];

void add(int

from,int to,int

dis)

void

dij()

}}int

main()

s=1;

dij();

for(int i=pre[n];i;i=pre[edge[i].from

]) bian[++bian[0]]=(i+1)/2

;

for(int i=1;i<=bian[0];i++)

printf(

"%d\n

",ans);

return0;

}

洛谷 P1186 瑪麗卡

這道題題目真的想吐槽一下.是在機房同學的解釋下才看懂的。就是讓你求在可以刪一條邊的情況下,並且刪後保證可以到達終點時,求刪了後的最大的最短路徑。70分暴力思路 列舉刪邊,然後跑一下最短路即可,思路很簡單,下面給出70分 include using namespace std vector e 101...

洛谷P1186瑪麗卡

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

洛谷 P1186 瑪麗卡

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