給定乙個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。輸出格式 輸出乙個整數,表示...