神奇的K短路 弗洛伊德思維題

2022-09-09 00:36:26 字數 1349 閱讀 7816

題目:

一天,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...