spfa algorithm
題目傳送門:
麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。
因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。
在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。
麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路正在維修,從瑪麗卡所在的城市都能到達麥克所在的城市。
瑪麗卡將只從不堵車的路上通過,並且她將按最短路線行車。麥克希望知道在最糟糕的情況下瑪麗卡到達他所在的城市需要多長時間,這樣他就能保證他的女朋友離開該城市足夠遠。
編寫程式,幫助麥克找出瑪麗卡按最短路線通過不堵車道路到達他所在城市所需的最長時間(用分鐘表示)。
輸入描述 input description
第一行有兩個用空格隔開的數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分鐘內是就能通過。
輸出描述 output description
輸出檔案的第一行中寫出用分鐘表示的最長時間,在這段時間中,無論哪條路在堵車,瑪麗卡應該能夠到達麥克處,如果少於這個時間的話,則必定存在一條路,該條路一旦堵車,瑪麗卡就不能夠趕到麥克處。
樣例輸入 sample input
5 71 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
樣例輸出 sample output
分析
本題求解最短路線通過不堵車道路到達他所在城市所需的最長時間,不難想到,堵車的道路一定要在最短路上才有最大值,否則無論道路在哪都不會影響原來的值。
首先進行一遍spfa,找出原圖中的最短路,並記錄路徑。再列舉路徑上的所有點,刪去這條邊,再spfa。一遍遍查詢,最終找到最大值。
注釋&**
1 #include "bits/stdc++.h"2
3using
namespace
std;
4const
int maxn = 210000;5
const
int inf = 1000000000;6
struct
edge
7e[ 5000010
];10
11int
n,m,cnt,p[ maxn ],dis[ maxn ];
12int
in[ maxn ],pre[ maxn ] ;
13bool
visited[ maxn ];
1415
void add_edge(const
int x,const
int y,const
intz)
1624
25void spfa ( const
ints )
265354}
55}56}
57}5859
void work ( int
x )6088}
89}90}
91 e[ x ].w = haha ;//
恢復 92}93
94int
main()
95105
106 spfa( 1
) ;107
int ans =dis [ n ] ;
108109
for ( int i=n ; i!=1 ; i =e[ pre[ i ] ].from
)113 printf ( "%d"
, ans ) ;
114return0;
115 }
(完)
Codevs 1021 瑪麗卡 洛谷 P1186
時間限制 2 s 空間限制 128000 kb 題目等級 大師 master 麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意...
CodeVS1021 瑪麗卡 最短路 線段樹
題目鏈結 宣告 感謝fzw kryj 的創意和熱心講解 麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修...
codevs 瑪麗卡(最短路路徑記錄)
時間限制 2 s 空間限制 128000 kb 題目等級 大師 master 題解 題目描述 description 麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙...