题目: 传送门
Code:
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
const int INF = 0x3f3f3f3f;
struct Edge {
int f, t, d;
};
vector<Edge> edges;
vector<int> G[N];
bool vis[N]; // 标记是否在队列中
int n, m;
int dist[N];
void AddEdge(int f, int t, int d) {
edges.push_back(Edge {f, t, d});
G[f].push_back(edges.size() - 1);
}
void spfa() {
memset(dist, 0x3f, sizeof dist);
queue<int> Q;
Q.push(1);
dist[1] = 0;
vis[1] = true;
while (!Q.empty()) {
int tp = Q.front();Q.pop();
vis[tp] = false;
for (int i=0;i<G[tp].size();i++) {
Edge& e = edges[G[tp][i]];
if (dist[e.t] > dist[e.f] + e.d) {
dist[e.t] = dist[e.f] + e.d;
Q.push(e.t);
vis[e.t] = true;
}
}
}
}
int main() {
int f, t, d;
scanf("%d %d", &n, &m);
for (int i=0;i<m;i++) {
scanf("%d %d %d", &f, &t, &d);
AddEdge(f, t, d);
}
spfa();
if (dist[n] > INF / 2) printf("impossible\n");
else printf("%d\n", dist[n]);
return 0;
}