Spfa算法模板

输入点数n,边数m,起点终点边权

输出1号节点到所有点的最短路径长度

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,head[100000],num,m,dis[100000];
bool vis[100000];
struct node{
    int pre,v,to,from;
}e[100000];
queue<int>q;
void put(int from,int to,int v)
{
    e[++num].pre=head[from];
    e[num].from=from;
    e[num].to=to;
    e[num].v=v;
    head[from]=num;
}
void spfa(int s)
{
    q.push(s);vis[s]=1;
    int point=s;
    while(!q.empty())
    {
        point=q.front();
        q.pop();
        vis[point]=0;
        for(int i=head[point];i;i=e[i].pre)
            if(dis[e[i].from]+e[i].v<dis[e[i].to])
            {
                dis[e[i].to]=dis[e[i].from]+e[i].v;
                q.push(e[i].to);
                vis[e[i].to]=1;                
            }
    }
}
int main()
{
    cin>>n>>m;
    int x,y,v;
    memset(dis,127/3,sizeof(dis));
    dis[1]=0;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y>>v;
        put(x,y,v);
        put(y,x,v);
    }
    spfa(1);
    for(int i=1;i<=n;i++)cout<<dis[i]<<' ';
}
原文地址:https://www.cnblogs.com/thmyl/p/6193729.html