最短路spfa

#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

typedef long long int ll;
const int maxn=100005;
int n,m,s,tot,dis[maxn],head[maxn];
struct node{
	int to,nxt;
	int w;
}t[maxn];
bool vis[maxn];
inline void add(const int x,const int y,const int z){
	t[++tot].to=y;t[tot].w=z;
	t[tot].nxt=head[x];head[x]=tot;
}
queue<int>q;
inline void spfa(const int s){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[s]=0;
	q.push(s);
	vis[s]=1;
	while(q.size()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=head[x];i;i=t[i].nxt){
			int y=t[i].to,z=t[i].w;
			if(dis[y]>dis[x]+z){
				dis[y]=dis[x]+z;
				q.push(y);
				vis[y]=1;
			}
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
	}
	spfa(s);
	for(int i=1;i<=n;i++){
		printf("%d ",dis[i]);
	} 
	return 0;
}

  

原文地址:https://www.cnblogs.com/weijianzhen/p/13409470.html