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;
 } 

 

posted @ 2022-04-07 14:05  山海自有归期  阅读(41)  评论(0编辑  收藏  举报