输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5, inf = 0x3f3f3f3f;
typedef pair<int, int> pii;
int n, m, e[N], ne[N], h[N], w[N], dis[N],idx;
bool st[N];
void add(int a, int b, int c) {
w[idx] = c;
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
int dijkstra() {
memset(dis, 0x3f, sizeof dis);
priority_queue<pii, vector<pii>, greater<pii> >heap;
heap.push({ 0,1 });
dis[1] = 0;//初始化起点位置;
while (heap.size()) {
auto now = heap.top();
heap.pop();
int pos = now.second, dist = now.first;
if (st[pos]) continue;
st[pos] = true;
for (int i = h[pos];i != -1;i = ne[i]) {
int j = e[i];
if (dis[j] > dist + w[i]) {//w[i]表示到i点这条边的距离而不是w[j]
dis[j] = dist + w[i]; //i只是个下标,e中在存的是i这个下标对应的点
heap.push({ dis[j],j });
}
}
}
if (dis[n] == inf) return -1;
else return dis[n];
}
int main() {
memset(h, -1, sizeof h);
cin >> n >> m;
for (int i = 0;i < m;i++) {
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
}
cout << dijkstra() << endl;
}