版权声明:转载请附上地址 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;
}