城市路(Dijkstra)
内存限制: 256 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较
题目描述
罗老师被邀请参加一个舞会,是在城市 n,而罗老师当前所处的城市为 1,附近还有很多城市 2 ~ n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。
现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。
输入格式
输入n, m,表示n个城市和m条路;
接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。
输出格式
输出1到n的最短路。如果1到达不了n,就输出-1。
样例
样例输入
复制5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
样例输出
复制90
数据范围与提示
【数据规模和约定】
1 ≤ n ≤ 2000
1 ≤ m ≤ 10000
0 ≤ c ≤ 10000
#include <bits/stdc++.h>
#define int long long
#define PII pair<int, int>
using namespace std;
const int N = 1.5e5, INF = 0x3f3f3f3f3f3f3f3f;
int n, m, s, t, x, y, z;
int dist[N];
bool visit[N];
vector<PII> a[N];
priority_queue<PII, vector<PII>, greater<PII> > Q;
void dijkstra() {
memset(dist, 0x3f, sizeof(dist));
dist[1] = 0;
Q.push({0, 1});
while(!Q.empty()) {
auto t = Q.top();
Q.pop();
int t2 = t.second;
if(visit[t2]) {
continue;
}
visit[t2] = true;
for(auto i : a[t2]) {
int j = i.second, w = i.first;
if(dist[j] > dist[t.second] + w) {
dist[j] = dist[t.second] + w;
Q.push({dist[j], j});
}
}
}
}
signed main() {
scanf("%lld %lld", &n, &m);
for(int i = 1; i <= m; i++) {
scanf("%lld %lld %lld", &x, &y, &z);
a[x].push_back({z, y});
a[y].push_back({z, x});
}
dijkstra();
if(dist[n] == INF) {
printf("-1");
return 0;
}
printf("%lld", dist[n]);
return 0;
}