社区讨论
蒟蒻求助,set优化Dijkstra为何错误
P3371【模板】单源最短路径(弱化版)参与者 5已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mi6uust1
- 此快照首次捕获于
- 2025/11/20 11:11 4 个月前
- 此快照最后确认于
- 2025/11/20 11:11 4 个月前
CPP
#include<bits/stdc++.h>
#define N 10001
#define M 500001
using namespace std;
struct Edge
{
int to,Next,cost;
}e[M<<1];
struct Dij
{
int id,val;
bool operator <(const Dij &a) const{
return val<a.val;}
};
int last[N],len,dis[N],s,n,m;
set<Dij> S;
inline void Add_Edge(int x,int y,int c)
{
e[++len]=(Edge){y,last[x],c};last[x]=len;
}
inline int read()
{
int res=0,flag=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+(c^48);c=getchar();}
return flag*res;
}
void dijkstra()
{
for(int i=1;i<=n;i++) dis[i]=2147483647;
dis[s]=0;
S.insert((Dij){s,0});
while(!S.empty())
{
Dij u=*S.begin();
S.erase(u);
for(int k=last[u.id];k;k=e[k].Next)
{
int to=e[k].to;
if(dis[to]>dis[u.id]+e[k].cost)
{
if(S.find((Dij){to,dis[to]})!=S.end()) S.erase((Dij){to,dis[to]});
dis[to]=dis[u.id]+e[k].cost;
S.insert((Dij){to,dis[to]});
}
}
}
}
int main()
{
n=read(),m=read(),s=read();
while(m--)
{
int x=read(),y=read(),c=read();
Add_Edge(x,y,c);
}
dijkstra();
for(int i=1;i<=n;i++) printf("%d ",dis[i]);
}
```
回复
共 5 条回复,欢迎继续交流。
正在加载回复...