社区讨论

dijkstra 36分 求调

P4779【模板】单源最短路径(标准版)参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo3fxzlk
此快照首次捕获于
2023/10/24 06:00
2 年前
此快照最后确认于
2023/10/24 06:00
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int read() {
	int nn=0,mm=1;
	char ch=getchar();
	while(ch>'9'||ch<'0') {
		if(ch=='-') {
			mm=-1;
		}
		ch=getchar();
	}
	while(ch<='9'&&ch>='0') {
		nn=nn*10+ch-'0';
		ch=getchar();
	}
	return nn*mm;
}
struct bian{
	int next;
	int len;
	int to;
} a[200001];
struct dian{
	int dis;
	int i;
	bool operator <(const dian &x)const{
        return x.dis<dis;
    }
};
int dis[100001],head[100001];
bool vis[100001];
int n,m,k;
priority_queue<dian>q;
void dijkstra() {
	for(int i=1; i<=n; i++) dis[i]=INT_MAX;
	dis[k]=0;
	while(!q.empty()){
		int now=q.top().i;
		q.pop();
		if(vis[now]){
			continue;
		}
		vis[now]=1;
		for(int i=head[now];i;i=a[i].next){
			int y=a[i].to;
			if(dis[y]>dis[now]+a[i].len) {
				dis[y]=dis[now]+a[i].len;
				if(!vis[y]){
					q.push({dis[y],y});
				}
			}
			
		}
	}
}
int main() {
	n=read(),m=read();
	k=read();
	for(int i=1;i<=m;i++){
		int s=read(),e=read(),len=read();
		a[i].next=head[s];
		a[i].len=len;
		a[i].to=e;
		head[s]=i;
	}
	q.push({0,k});
	dijkstra();
	for(int i=1;i<=n;i++){
		printf("%d ",dis[i]);
	}
	return 0;
}

回复

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

正在加载回复...