详细SPFA算法模板

该博客介绍了如何运用Bellman-Ford算法解决图中节点之间的最短路径问题。代码示例展示了如何初始化、更新路径长度以及避免负权边导致的无限循环。通过广度优先搜索(BFS)实现,适用于存在负权边的情况。
摘要由CSDN通过智能技术生成
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值