社区讨论

关于dij的一点疑问

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lo8aq6uy
此快照首次捕获于
2023/10/27 15:32
2 年前
此快照最后确认于
2023/10/27 15:32
2 年前
查看原帖
突发奇想,发现了一个问题:
求助各位神犇,为什么第一份会T前三?
CPP
#include<bits/stdc++.h>
#define PII pair<int,int>
const int N=5e5+5,M=1e9; 
using namespace std;
int n,m,s;
int fst[N],nxt[N],to[N],sum[N];
int tot;
void add_edge(int u,int v,int w){
	nxt[++tot]=fst[u];
	fst[u]=tot;
	to[tot]=v;
	sum[tot]=w;	
}

int dist[N];
priority_queue<PII,vector<PII>,greater<PII> >dui;
bool rit[N];

void dijkstra(int p){
	for(int i=1;i<=n;i++) dist[i]=M;
	dist[p]=0;
	dui.push({0,p});
		
	while(dui.size()){
		while(rit[dui.top().second]) dui.pop();
		PII t=dui.top();
		
		int nw=t.second;dui.pop();
		rit[nw]=1;
		for(int i=fst[nw];i;i=nxt[i]){
			int t_o=to[i],w=sum[i];
			if(dist[nw]+w<dist[t_o]){
				dist[t_o]=dist[nw]+w;
				if(!rit[t_o])
					dui.push({dist[t_o],t_o});
			}
		}
	}
	return;
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add_edge(u,v,w);
	}
	
	dijkstra(s);
	for(int i=1;i<=n;i++)
		printf("%d ",dist[i]);
	return 0;
}
CPP
#include<bits/stdc++.h>
#define PII pair<int,int>
const int N=5e5+5,M=1e9; 
using namespace std;
int n,m,s;
int fst[N],nxt[N],to[N],sum[N];
int tot;
void add_edge(int u,int v,int w){
	nxt[++tot]=fst[u];
	fst[u]=tot;
	to[tot]=v;
	sum[tot]=w;	
}

int dist[N];
priority_queue<PII,vector<PII>,greater<PII> >dui;
bool rit[N];

void dijkstra(int p){
	for(int i=1;i<=n;i++) dist[i]=M;
	dist[p]=0;
	dui.push({0,p});
		
	while(dui.size()){
		PII t=dui.top();
		int nw=t.second; dui.pop();
		if(rit[nw]) continue;
		
		rit[nw]=1;
		for(int i=fst[nw];i;i=nxt[i]){
			int t_o=to[i],w=sum[i];
			if(dist[nw]+w<dist[t_o]){
				dist[t_o]=dist[nw]+w;
				if(!rit[t_o])
					dui.push({dist[t_o],t_o});
			}
		}
	}
	return;
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add_edge(u,v,w);
	}
	
	dijkstra(s);
	for(int i=1;i<=n;i++)
		printf("%d ",dist[i]);
	return 0;
}

回复

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

正在加载回复...