最短路径之SPFA算法(边表)

#include <bits/stdc++.h>
#define MAXN 100005
#define MAXM 1000005
#define INF (int)1e9
using namespace std;

int head[MAXN], Next[MAXM], vet[MAXM],cost[MAXM], cnt;

void add(int x, int y, int c){
    cnt++;
    Next[cnt] = head[x];
    head[x] = cnt;
    vet[cnt] = y;
    cost[cnt] = c;
}

int n,m;
int dis[MAXN], vis[MAXN];

void init(){
    for (int i = 1; i <= n; ++i) {
        head[i] = -1;
        dis[i] = INF;
        vis[i] = 0;
    }
}

void SPFA(int s){
    dis[s] = 0;
    queue<int> q;
    q.push(s);
    vis[s] = 1;
    while(!q.empty()){
        int t = q.front();
        q.pop();
        vis[t] = 0;
        for (int i = head[t]; i != -1; i = Next[i]) {
            if(dis[vet[i]] > dis[t]+cost[i]){
                dis[vet[i]] = dis[t]+cost[i];
                if(!vis[vet[i]]) {
                    q.push(vet[i]);
                    vis[vet[i]] = 1;
                }
            }
        }
    }
}

int main()
{
    int s;
    cin >> n >> m;
    int x,y,c;
    init();
    for (int i = 0; i < m; ++i) {
        scanf("%d%d%d",&x, &y, &c);
        if(x == y)        //判断自环
            continue;
        add(x,y,c);
        add(y,x,c);
    }
    SPFA(1);
//    for (int i = 1; i <= n; ++i) {
//        cout << dis[i] << " ";
//    }
    cout << dis[n] << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_30115697/article/details/81839201