模板 最短路徑(Dijkstra 4heap)

2022-04-30 23:54:12 字數 1665 閱讀 7835

基本介紹

模板題目

**實現

終於來發堆優化的迪傑斯特拉了 普通的迪傑斯特拉複雜度是o(n^2)的 感覺對於資料大的題和弗洛伊德沒什麼兩樣吧 但是堆優化後能到o((m+n) log n) 還比較不錯 但不能去搞圖中有負邊權的情況

我的**採用了大佬zheng.ht的模板 用c++的stl優先佇列實現 不知道為什麼**看起來那麼像spfa 關於stl 的東西也就不多說了 至於make_pair就是兩個東西打包吧變成乙個 在這個演算法中就能便於把點編號和距離一起壓進堆中 比較舒服

**的原理就是用堆來儲存原點到其他點的距離並且維護最小值 訪問邊的時候進行更新 總是感覺和spfa有比較像的地方

題目描述

給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。

輸入輸出格式

輸入格式:

第一行包含三個整數n、m、s,分別表示點的個數、有向邊的個數、出發點的編號。

接下來m行每行包含三個整數fi、gi、wi,分別表示第i條有向邊的出發點、目標點和長度。

輸出格式:

一行,包含n個用空格分隔的整數,其中第i個整數表示從點s出發到點i的最短路徑長度(若s=i則最短路徑長度為0,若從點s無法到達點i,則最短路徑長度為2147483647)

輸入輸出樣例

輸入樣例:

4 6 1

1 2 2

2 3 2

2 4 1

1 3 5

3 4 3

1 4 4

輸出樣例:

0 2 4 3

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define in = read()

typedef

long

long ll;

const ll size = 1000000 + 10000;

struct pointedge[size];

priority_queue , vector

> , greater> > q;

ll n,m,s;

ll site;

ll head[size],dis[size];

bool exist[size];

inline ll read()

while(isdigit(ch))

return num*f;

}inline

void add(ll x,ll y,ll z)

int main()

for(int i=1;i<=n;i++) dis[i] = 2147483647; dis[s] = 0;

ll u;

pairx;

q.push(make_pair(0,s));

while(!q.empty())

}for(int i=1;i<=n;i++)

printf("%d ",dis[i]);

}//coyg

最短路徑dijkstra模板

第一行兩個整數n m。n表示頂點個數 頂點編號為1 n m表示邊的條數。接下來m行表示,每行有3個數x y z。表示頂點x到頂點y邊的權值為z。求源點為1的最短路徑。題目 坐在馬桶上看演算法 演算法7 dijkstra最短路演算法 這道題我只是想練練dijkstra模板,dijkstra主要由兩個步...

最短路徑之 Dijkstra模板

一 時間複雜度為o v v 的dijkstra const int max v 100 10 const int inf 1 30 int cost max v max v 權值 int d max v 頂點 出發最短距離 bool used max v 以使用過的圖 int v 頂點數 int e...

最短路 路徑還原(dijkstra,模板)

b.wzy的大冒險 出發咯qaq 單點時限 2.0 sec 記憶體限制 512 mb 第一行兩個數n,m 1 n 103,1 m 103 接下來m行,每行三個數x,y,z,表示點 x 與點 y 之間有一條權值為 z 的有向邊 1 x,y,z 103 第一行乙個整數表示 1 到 n 的最短距離 第二行...