所谓的SPFA其实就是Bellman-Ford的队列优化解决的也是单源最短路问题
#include
using namespace std;
#define pii pair<int,int>
#define il inline
#define re register
#define FOR(i,n,s) for(int i=(s);i<=(n);i++)
const int MAXN=1e7;
vector<pii> edges[MAXN];
int dis[MAXN];
int n,m,s;
bool inQueue[MAXN];
queue<int> q;
//SPFA
il void SPFA()
{
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
edges[u].emplace_back(v,w);
}//读入
dis[s]=0;
q.push(s);//把起点入队
inQueue[s]=true;//标记
while(!q.empty())
{
int x=q.front();q.pop();
inQueue[x]=false;
for(auto edge:edges[x])
{
if(dis[edge.first]<=dis[x]+edge.second) continue;
dis[edge.first]=dis[x]+edge.second;//Bellman-Ford松弛操作
if(!inQueue[edge.first])
{
q.push(edge.first);
inQueue[edge.first]=true;
}
}
}
return;
}
//
int main()
{
cin>>n>>m>>s;
SPFA();
return 0;
}
一开始将起点 置入队列,每次取出队头,并将有效松弛(bellman-ford)后的点重新置入队列,并打上标记,表示可以用这个点更新其它点,思路类似于bfs,最后就可以得到最短路