社区讨论

蒟蒻求助,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 条回复,欢迎继续交流。

正在加载回复...