社区讨论

蒟蒻不知道dij怎么搞优先队列(加结构体)优化,大佬能帮个忙吗?

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lo96dho8
此快照首次捕获于
2023/10/28 06:18
2 年前
此快照最后确认于
2023/10/28 06:18
2 年前
查看原帖
五个点全部TLE,优先队列要套结构体。麻烦大佬们照我的思路调一下,感谢。
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,s,d[100001];
bool f[100001];
struct Edge{
	int to,w,next;
}; Edge edge[1000001];
int tot,pre[1000001];
inline void add(int u,int v,int w){
	edge[tot].to=v;
	edge[tot].w=w;
	edge[tot].next=pre[u];
	pre[u]=tot;
	tot++;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++) pre[i]=-1;
	for(int i=1;i<=n;i++) d[i]=1e10;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	int t=n;
	d[s]=0;
	while(t--){
		int m=-1;
		for(int i=1;i<=n;i++){
			if(f[i]==0&&(m==-1||d[m]>d[i])){
				m=i;
			}
		}
		f[m]=1;
		for(int i=pre[m];i!=-1;i=edge[i].next){
			int v=edge[i].to,w=edge[i].w;
			if(!f[v]&&d[m]+w<d[v]){
				d[v]=d[m]+w;
			}
		}
	}
	for(int i=1;i<=n;i++){
	    cout<<d[i]<<" ";
	}
	return 0;
}
```cpp

回复

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

正在加载回复...