社区讨论
关于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 条回复,欢迎继续交流。
正在加载回复...