spfa算法板子
#include<iostream> #include<algorithm> #include<queue> #include<cstring> using namespace std; const int N=100010; int h[N], w[N], e[N], ne[N], cur; int d[N]; bool st[N]; int n,m; void add(int v1,int v2,int wg) { e[cur] = v2; w[cur] = wg; ne[cur] = h[v1]; h[v1] = cur ++; } int spfa() { memset(d, 0x3f, sizeof d);//初始化 d[1] = 0; queue<int> q; q.push(1);//1为图中第一个点且1到其本身的最短路已知,即为0,将1入队 st[1] = true;//入队将节点标记为true while (q.size()) { int t = q.front(); q.pop(); st[t] = false;//出队将节点标记为false for (int i = h[t]; i != -1; i = ne[i]) {//将与节点t直接有边相连的节点j进行遍历,如果j能通过点t进行松弛操作 , 则将j入队 int j = e[i]; if (d[j] > d[t] + w[i]) {//如果能进行松弛 d[j] = d[t] + w[i]; if (!st[j]) { q.push(j); st[j] = true; } } } } return d[n]; } int main() { cin >> n >> m; memset(h, -1, sizeof(h)); while (m -- ) { int v1, v2, w; cin >> v1 >> v2 >> w; add(v1, v2, w); } int t = spfa(); if (t == 0x3f3f3f3f) cout << "impossible" << endl; else cout << t; return 0; }