#include<bits/stdc++.h>
#include<queue>
using namespace std;
int head[101],f[101],d[101];//head是每次的起点,f标记走过没有,d表示路径长
int n,m,t;//n表示节点数,m表示边数,t用来记录下标
struct node{
int pre,next,w;//到达的节点,下一个节点,值
}a[101];
queue<int> q;
void spfa()
{
for(int i=1;i<=n;i++)
d[i]=1e9;//把路径全部标记成最大值
d[1]=0;//起点值为0,1表示起点
f[1]=1;//起点1,走过了
q.push(1);//起点入队
while(q.size())//没有走完所有点
{
int x=q.front();//获取当前点作为起点
q.pop();
f[x]=0;//这个点标记为0没有走过
for(int i=head[x];i;i=a[i].next)//i获取这个的起点,链接下一个点
{
int j=a[i].pre,k=a[i].w;//获取要到达的点,和路径长度
if(d[j]>d[x]+k)//在目标节点之间有一条更短的路
{
d[j]=d[x]+k;//更新路径
if(!f[j])//没有走过这点
{
f[j]=1;//标记走过
q.push(j);//把这点放在队里去
}
}
}
}
}
void add(int x,int y,int z)
{
t++;//下标后移
a[t].next=head[x];//走到当前节点
a[t].pre=y;//到达y
a[t].w=z;//路径长度
head[x]=t;//记录当前起点
}
int main()
{
cin>>n>>m;//输入节点数与边数
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;//输入点与点的长度
add(x,y,z);//连接
add(y,x,z);
}
spfa();
cout<<d[n];//输出终点
return 0;
}
详细SPFA算法模板
于 2022-03-16 20:40:44 首次发布
该博客介绍了如何运用Bellman-Ford算法解决图中节点之间的最短路径问题。代码示例展示了如何初始化、更新路径长度以及避免负权边导致的无限循环。通过广度优先搜索(BFS)实现,适用于存在负权边的情况。
摘要由CSDN通过智能技术生成