850 Dijkstra求最短路 II

2022-05-18 05:31:23 字數 1267 閱讀 3470

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。

請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出-1。

輸入格式

第一行包含整數n和m。

接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。

輸出格式

輸出乙個整數,表示1號點到n號點的最短距離。

如果路徑不存在,則輸出-1。

資料範圍1≤

n,m≤

105'>1≤n,m≤105

1≤n,m≤105,

圖中涉及邊長均不超過10000。

輸入樣例:

3 3

1 2 2

2 3 1

1 3 4

輸出樣例:
3

**實現:

//堆優化版本的dijkstra()

#include#include#includeusing namespace std;

//我們需要用堆來維護所有的點的距離,維護距離的時候我們需要知道結點編號是多少

//所以堆裡邊存的其實是乙個pair

typedef pairpii;

const int n = 1e5 + 10;

//n,m都是1e5,屬於稀疏圖用鄰接表

int d[n];

int h[n],ne[n],e[n],idx;

bool st[n];

//權重

int w[n];

int n,m;

void add(int a,int b,int c)

int dijkstra());//距離是0編號是1

//當佇列不為空

while(heap.size()));}}

}if(d[n] == 0x3f3f3f3f) return -1;

return d[n];

}int main()

//用鄰接表不用去除重邊,因為演算法本身保證了最短路,所以不需要對重邊做特殊的處理

cout << dijkstra() << endl;

return 0;

}

850 Dijkstra求最短路 II

5481335499920981350在這裡我們用到了優先佇列,我本想自己寫乙個堆,後來看到用的是pii,太麻煩了,開三個陣列還有很多操作,我就用優先佇列了。include include include include using namespace std const int n 1e6 10 ...

Dijkstra求最短路

題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示1...

Dijkstra求最短路

題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為非負值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示...