SPFA模板

更改了一下不应-羁绊的模板,更加实用了。

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <string>
#include <queue>
#include <map>
#include <cmath>

using namespace std;

#define maxn 10000
#define inf 0x3f3f3f3f

struct Edge {
    int w;
    int v;
};

int spfa(vector<vector<Edge> >& vadj,int n,int s,int t)
{
    int dist[maxn];
    for(int i=0;i<n;i++)
        dist[i] = inf;

    dist[s] = 0;
    bool vis[maxn];

    memset(vis,false,sizeof(vis));

    vis[s] = true;

    queue<int> Q;
    Q.push(s);

    while(Q.size())
    {
        int u = Q.front();
        Q.pop();
        vis[u] = false;

        for(int i=0;i<vadj[u].size();i++)
        {
            Edge next = vadj[u][i];
            if(dist[next.v]>dist[u]+next.w)
            {
                dist[next.v] = dist[u]+next.w;
                if(!vis[next.v])
                {
                    Q.push(next.v);
                    vis[next.v] = true;
                }
            }
        }

    }
    return dist[t];
}

int main()
{
    //freopen("input.txt","r",stdin);
    int n,m;
    cin>>n>>m;

    int s,t;
    cin>>s>>t;

    --s;
    --t;

    vector<vector<Edge> > vadj(n);

    for(int i=0;i<m;i++)
    {
        int u,v,d;
        scanf("%d%d%d",&u,&v,&d);
        --u;
        --v;
        Edge edge1,edge2;
        edge1.v = v;
        edge1.w = d;
        edge2.v = u;
        edge2.w = d;
        vadj[u].push_back(edge1);
        vadj[v].push_back(edge2);
    }
    cout<<spfa(vadj,n,s,t)<<endl;

    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5809680.html