#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int cnt;
int head[maxn];
int dis[maxn];
bool st[maxn]; //用于记录节点是否在更新队列当中
struct Edge {
int to, next, wt;
}edges[maxn];
void add(int u, int v, int w) {
edges[++cnt].to = v;
edges[cnt].wt = w;
edges[cnt].next = head[u];
head[u] = cnt;
}
int spfa(int s, int d) {
memset(dis, 0x3f, sizeof dis);
memset(st, 0, sizeof st);
queue<int> q; //更新队列
dis[s] = 0; st[s] = true; q.push(s);
while (q.size()) {
int f = q.front();
q.pop();
st[f] = false;
for (int e = head[f]; e != 0; e = edges[e].next) {
int j = edges[e].to, w = edges[e].wt;
if (dis[j] > dis[f] + w) {
dis[j] = dis[f] + w;
if (!st[j]) {
q.push(j);
st[j] = true;
}
}
}
}
if (dis[d] < 0x3f3f3f3f) {
return dis[d];
}
else {
return -1;
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("D:/VS CODE/C++/in.txt", "r", stdin);
freopen("D:/VS CODE/C++/out.txt", "w", stdout);
#endif
memset(head, -1, sizeof head);
int n, m;
cin >> n >> m;
for (int i = 0;i < m;++i) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
add(u, v, w);
}
int t = spfa(1, n);
if (t == -1)
cout << "impossible" << endl;
else {
cout << t;
}
fclose(stdin);
fclose(stdout);
return 0;
}
spfa求最短路 模板
最新推荐文章于 2023-04-18 23:15:46 发布