整理了最短路bellman-ford(SPFA)算法模版,方便自己复习
/*
输入节点数n、边数m
接下来m行 输入边的起点、终点、长度
输出节点1到其他节点的最短路长度
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=20005;
const int inf=2e9;
struct Edge{
int from,to,dist;
Edge(int u,int v,int d):from(u),to(v),dist(d){
}
};
struct Dijkstra{
int n,m;
vector<Edge> edges;//边类型数组
vector<int> G[maxn];
bool done[maxn];//是否已找到最短路
int d[maxn];//s到各个点的距离
int p[maxn];//最短路中的上一条弧
void init(int n){//初始化
this->n=n;
for(int i=0;i<n;i++){
G[i].clear();
}
edges.clear();
}
void AddEdge(int from,int to,int dist){//增加边
edges.push_back(Edge(from,to,dist));
m=edges.size();
G[from].push_back(m-1);//记下以节点from出发的边在边数组中的序号
}
struct HeapNode{
int d,u;//有一条s到u的距离为d的路
bool operator < (const HeapNode& rhs) const{
return d>rhs.d;
}
};
bool bellan_ford(int s){
queue<int> Q;
int inq[maxn];//该节点是否在队列中
int cnt[maxn];//根据该节点更新了多少次
memset(inq,0,sizeof(inq));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++){
d[i]=inf;
}
d[s]=0;
inq[s]=true;
Q.push(s);
while(!Q.empty()){
int u=Q.front();
Q.pop();
inq[u]=false;
for(int i=0;i<G[u].size();i++){
Edge& e=edges[G[u][i]];
if(d[u]<inf&&d[e.to]>d[u]+e.dist){//通过点u更新s到其他节点的最短路长度
d[e.to]=d[u]+e.dist;
p[e.to]=G[u][i];
if(!inq[e.to]){// 该节点不在队列中
Q.push(e.to);
inq[e.to]=true;//进队列
if(++cnt[e.to]>n){//有负环
return false;
}
}
}
}
}
return true;
}
}dj;
int main(){
int n,m;
cin>>n>>m;
dj.init(n);
for(int i=0;i<m;i++){
int u,v,l;
scanf("%d%d%d",&u,&v,&l);
u--;v--;
dj.AddEdge(u,v,l);
}
dj.bellan_ford(0);
for(int i=1;i<n;i++){
printf("%d\n",dj.d[i]);
}
return 0;
}