題目:
一天,highlights實在是閒的不行,他選取了n個地點,n各地點之間共有m條路徑,他想找到這m條路徑組成的第k短路,你能幫助他嘛?
輸入
第一行三個正整數,地點的數量n(2 <= n <= 2e5),邊的數量m(1 <= m <= 2e5),k(1 <= k <= min(m, 200))。
接下來m行,每行三個整數,邊的乙個頂點u(1<=u<=n),邊的另乙個頂點v(1<=v<=n),邊的權值w(1<=w<=1e5),代表u有一條到v權值為w的單向邊。
輸出
輸出k短路的權值。
樣例
輸入: 輸出:
4 4 3 16
1 3 27
1 4 16
1 2 15
2 4 3
剛開始看到這題,乍一想,這不就是弗洛伊德板子題嗎,然後很光榮的re了。回頭一看資料範圍,2e5的邊,弗洛伊德肯定炸了,再一看k最大只有200,所以有了以下想法:
1、對所有邊進行乙個排序;
2、從小到**出前k條邊;
3、對選出的邊的點進行重新編號;
4、這下最大只有200^3的複雜度了;
5、跑一遍弗洛伊德,然後求出第k小就可以了
悄咪咪的說一句,q神說這就是個簡單的思維題,5555555555555555555
愉快ac
#include#include#include#include#includeusing namespace std;
#define inf 1e9 + 5
const int maxn = 2e5 + 10;
int n, m, k;
struct edge es[maxn];
mapmp;
int d[500][500];
bool cmp(edge a, edge b)
void init() }}
void floyd(int k)
} }}int main()
floyd(t - 1);
priority_queue, less>pq;
/* for (int i = 1; i <= t; i++)
cout << endl;
} */
for(int i = 1; i <= t - 1; i++)
}} }
printf("%d\n", pq.top());
return 0;
}
弗洛伊德最短路c
include includeusing namespace std const int inf 100000000 void floyd vector distmap,可被更新的鄰接矩陣,更新後不能確定原有邊 vector path 路徑上到達該點的中轉點 福利 這個函式沒有用除inf外的任何全域...
最短路徑之弗洛伊德
floyd演算法是大二到大三期間集訓時候才算真正接觸的,或許只有前一段時間dp的積累現在才算是真正理解 這個演算法需要充分理解dp的滾動陣列思想才能算是真正的掌握 floyd演算法又稱為插點法 演算法的目標是要求圖中所有兩個點的最短距離,就用dis i j 來表示 但是dis i j 是不夠設定為狀...
弗洛伊德演算法求最短路徑
include includeusing namespace std 鄰接矩陣的型別定義 define max 10000000 define max vertex num 20 typedef struct mgraph 構造有向網的鄰接矩陣 void createdn am mgraph g,i...