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求单源最短路(可用于有负边权)的主要内容,如果未能解决你的问题,请参考以下文章