麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。
因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。
在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。
麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路正在維修,從瑪麗卡所在的城市都能到達麥克所在的城市。
瑪麗卡將只從不堵車的路上通過,並且她將按最短路線行車。麥克希望知道在最糟糕的情況下瑪麗卡到達他所在的城市需要多長時間,這樣他就能保證他的女朋友離開該城市足夠遠。
編寫程式,幫助麥克找出瑪麗卡按最短路線通過不堵車道路到達他所在城市所需的最長時間(用分鐘表示)。
第一行有兩個用空格隔開的數nn和mm,分別表示城市的數量以及城市間道路的數量。1≤n≤1000,1≤m≤n \times (n-1)/21≤n≤1000,1≤m≤n×(n−1)/2。城市用數字1-n1−n標識,麥克在城市11中,瑪麗卡在城市nn中。
接下來的mm行中每行包含三個用空格隔開的數a,b,va,b,v。其中1≤a,b≤n,1≤v≤10001≤a,b≤n,1≤v≤1000。這些數字表示在aa和城市bb中間有一條雙行道,並且在vv分鐘內是就能通過。
一行,寫出用分鐘表示的最長時間,在這段時間中,無論哪條路在堵車,瑪麗卡應該能夠到達麥克處,如果少於這個時間的話,則必定存在一條路,該條路一旦堵車,瑪麗卡就不能夠趕到麥克處。
輸入 #1複製
5 71 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
輸出 #1複製
27題解:我一開始真的每條邊都刪去,結果80分,後來想一想,只要刪去
有用的邊就可以了,因此有了這個小優化qwq
#include#include#include
#include
#include
#include
#include
using
namespace
std;
const
int oo=0x3f3f3f3f
;int n,m,k,cnt,x,y,z,s,t,dis[2300],vis[2300],f[500*999
];struct
nodee[
1000003
];int head[2300],cut[1001][1001
],flag;
void add(int a,int b,int
c)queue
q;intspfa()} }
}return
dis[n];
}inline
intread()
while(isdigit(ch))
return out *f;
}int
main()
int ans=0
;
/*for(int i=1;i<=m*2;i+=2)
*/flag=1
; ans=spfa();
flag=0
;
for(int i=n;i!=1;i=f[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 瑪麗卡
麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路...