麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。
因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。
在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。
麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路正在維修,從瑪麗卡所在的城市都能到達麥克所在的城市。
瑪麗卡將只從不堵車的路上通過,並且她將按最短路線行車。麥克希望知道在最糟糕的情況下瑪麗卡到達他所在的城市需要多長時間,這樣他就能保證他的女朋友離開該城市足夠遠。
編寫程式,幫助麥克找出瑪麗卡按最短路線通過不堵車道路到達他所在城市所需的最長時間(用分鐘表示)。
輸入格式:
第一行有兩個用空格隔開的數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分鐘內是就能通過。
輸出格式:
一行,寫出用分鐘表示的最長時間,在這段時間中,無論哪條路在堵車,瑪麗卡應該能夠到達麥克處,如果少於這個時間的話,則必定存在一條路,該條路一旦堵車,瑪麗卡就不能夠趕到麥克處。
顯然 先跑一下普通的最短路
然後對該最短路進行刪除(因為刪除別的不影響這條最短路) 列舉每條最短路邊
#include#includeview code#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int inf=1e9+7
;inline
int read()//
拙劣的快讀
while(c>='
0'&&c<='9')
return f*p;}
struct
edge
p[900009];//
存邊int n,m,cnt,ans,head[900009],pre[900009],dis[1009],vis[1009
];int que[900009];//
模擬佇列
bool f=1;//
用來記錄是否是第一次spfa
inline void add_edge(int x,int y,int w)//
加邊操作
inline
void spfa()//
用來第一次spfa(f)和最後刪邊後的spfa(!f) }}
}}int
main()
spfa();
//第一次全邊跑一次spfa
ans=dis[n];//
記錄第一次dis[n]
f=0;//
開始刪邊標記
for(int i=pre[n];i;i=pre[p[i].from])//
遍利所有邊刪邊
printf("%d
",ans);
return0;
}
題解 P1186 瑪麗卡
這個題意實在是太模糊了,我也是聽了大佬的解釋才明白的。我可以再次翻譯一遍題意qaq 找出在一條邊斷掉的情況下的單源最短路徑,並輸出最壞的情況 去邊不同會影響最短路 完了?完了。所以思路就出來了 一一去掉所有邊,分別去求最短路。仔細想想 時間複雜度 dijkstra o n 2 m 如果是dalao寫...
洛谷P1186 瑪麗卡(斷邊 最短路)
傳送門 這個題意描述的狗屁不通。其實大概就是 1 n有m條邊 但m條邊中可能會有一條邊無法通過 求出時間t,保證時間t內無論哪條路無法通過,都能滿足有一條從1 n路徑總時間小於或等於t的最短路然後思路就很簡單啊,我們列舉最短路的邊,依次斷掉每一條同時再跑一遍最短路,統計一下最大值即可。通過乙個pre...
洛谷 P1186 瑪麗卡
這道題題目真的想吐槽一下.是在機房同學的解釋下才看懂的。就是讓你求在可以刪一條邊的情況下,並且刪後保證可以到達終點時,求刪了後的最大的最短路徑。70分暴力思路 列舉刪邊,然後跑一下最短路即可,思路很簡單,下面給出70分 include using namespace std vector e 101...