SPFA模版

所谓的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,最后就可以得到最短路

你可能感兴趣的:(图论,算法)