【模板】单源最短路径(标准版)--SPFA

版权声明:转载请附上地址 https://blog.csdn.net/weixin_44574520/article/details/87558133

【模板】单源最短路径(标准版)

洛谷
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目分析:

SPFA要用上优先队列优化,要重载优先队列的运算符,有一组数据过大,要把d数组初值赋大

Code:

#include <bits/stdc++.h>
using namespace std;
#define maxn 100010
#define maxm 200010
struct node{
	int u,v,w,next;
}e[maxm];
int size=0,n,m,s,head[maxm],vis[maxn];
long long d[maxn];
struct cmp{
	bool operator()(int aa,int bb){
		return d[aa]>d[bb];
	}
};

inline int read_(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
} 

inline void clean_(){
	memset(head,-1,sizeof(head));
	//for(int i=0;i<=maxn;i++) d[i]=1e10;
	memset(d,0x7f,sizeof(d));
	memset(vis,0,sizeof(vis));
}

inline void add_(int u,int v,int w){
	e[size].u=u;
	e[size].v=v;
	e[size].w=w;
	e[size].next=head[u];
	head[u]=size++;
}

inline void spfa_(){
	priority_queue<int,vector<int>,cmp> q;
	d[s]=0;
	q.push(s);
	vis[s]=1;
	while(!q.empty()){
		int x=q.top();
		q.pop();
		vis[x]=0;
		for(int i=head[x];~i;i=e[i].next){
			int v=e[i].v,w=e[i].w;
			if(d[v]>d[x]+w){
				d[v]=d[x]+w;
				if(!vis[v]){
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
}

inline void init_(){
	freopen("spfay.txt","r",stdin);
}

inline void readda_(){
	clean_();
	n=read_();m=read_();s=read_();
	int a,b,z;
	for(int i=1;i<=m;i++){
		a=read_();b=read_();z=read_();
		add_(a,b,z);
	}
}

inline void work_(){
	spfa_();
	for(int i=1;i<=n;i++) printf("%lld ",d[i]);
}
int main(){
	init_();
	readda_();
	work_();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44574520/article/details/87558133
今日推荐