社区讨论

spfa求调

P3371【模板】单源最短路径(弱化版)参与者 3已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@lo7p5wki
此快照首次捕获于
2023/10/27 05:29
2 年前
此快照最后确认于
2023/10/27 05:29
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int fir[200005],nxt[2000005],son[200005],w[200005],tot,n,m,s,dis[200005],vis[200005];
int q[10000005],h=1,t=0;
void read(int &x){
	x=0;int f=1;char c=getchar();
	while(!(c<='9'&&c>='0')){if(c=='-')f=-1;c=getchar();}
	while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	x*=f;
}
void add(int x,int y,int z){
	son[++tot]=y;nxt[tot]=fir[x];fir[x]=tot;w[tot]=z;
}
void spfa(){
	memset(dis,127,sizeof(dis));
	q[++t]=s;dis[s]=0;vis[s]=true;
	while(h<=t){
		int x=q[h];h++;vis[x]=false;
		for(int i=fir[x];i;i=nxt[i]){
			if(dis[son[i]]>dis[x]+w[i]){
				dis[son[i]]=dis[x]+w[i];
				if(!vis[son[i]]){
					vis[son[i]]=true;
					q[++t]=son[i];
				}
			}
		}
	}
}
signed main(){
	read(n);read(m);read(s);
	for(int i=1;i<=m;i++){
		int x,y,z;read(x);read(y),read(z);
		add(x,y,z);
	}
	spfa();
	for(int i=1;i<=n;i++)printf("%lld ",dis[i]);
	return 0;
}


回复

13 条回复,欢迎继续交流。

正在加载回复...