spfa求单源最短路(可用于有负边权)

Posted 梦西空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spfa求单源最短路(可用于有负边权)相关的知识,希望对你有一定的参考价值。

//spfa求单源最短路(可用于有负边权的最短路问题) 时间复杂度O(n*m)
#include<bits/stdc++.h>
using namespace std;
typedef struct node

	int x;	//记录到达的点 
	int dis;	//记录距离 
N;
int vis[100010];	//vis标记节点是否在队列中 
int dist[100010],n,m;	//dis记录距离,n为节点数量,m为边数量 
vector<N>v[100010];
void spfa(int x)

	memset(dist,0x3f,sizeof(dist));	
	//初始化 
	dist[x] = 0;
	vis[x] = 1;
	queue<int> q;
	q.push(x);
	while(!q.empty())
	
		int f = q.front();
		q.pop();
		vis[f] = 0;	//出队标记改为0; 
		for(int i = 0;i<v[f].size();i++)
		
			if(v[f][i].dis+dist[f]<dist[v[f][i].x])
				//路径更新 
				dist[v[f][i].x] = v[f][i].dis+dist[f];
				if(vis[v[f][i].x]==0)//没在队列中则此节点加入队列 
				
					q.push(v[f][i].x);
					vis[v[f][i].x] = 1;
				
						
		
	

int main()

	int a,b,c,s;
	cin>>n>>m>>s;
	for(int i = 0;i<m;i++)
	
		cin>>a>>b>>c;
		v[a].push_back((N)b,c);
	
	spfa(s);
	//下标从1开始 
	for(int i = 1;i<=n;i++)
		cout<<dist[i]<<" ";
	return 0;


以上是关于spfa求单源最短路(可用于有负边权)的主要内容,如果未能解决你的问题,请参考以下文章

Bellman_Ford和SPFA:带负边权的单源最短路算法

Dijkstra算法求单源最短路

Dijkstra算法

图论最短路

Floyd算法:多源汇最短路

探秘SPFA——强大的单源最短路径算法