dijkstra堆优化

不喝水的杰 荣耀黄金
宾川县微洛电子商务工作室官方账号
2022-08-27 20:16:13
#include <bits/stdc++.h>
#define MOD 10000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int maxn=1000005;
int n,m,s;
//e存终点,w存权值,h存表头,next存下一个点(h和next形成了链表)
int idx,e[maxn],w[maxn],h[maxn],ne[maxn];
int dis[maxn],vis[maxn];//距离,标记
 
struct Node {
	int dis,x;//距离和当前点
	//重载运算符(将小于改为大于)
	bool operator < (Node p) const {
		return dis > p.dis;
	}
	Node(int dis,int x):dis(dis),x(x) {}
};
 
//邻接表
void add(int a,int b,int c) {
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}
 
void dijkstra() {
	memset(dis,INF,sizeof(dis));//初始化
	priority_queue<Node> q;
	dis[s]=0;
	Node u(dis[s],s);
	q.push(u);
	while(!q.empty()) {
		Node u=q.top ();
		q.pop();
		if(vis[u.x]) continue;
		vis[u.x]=1;
		for(int i=h[u.x]; i!=-1; i=ne[i]) {
			if(dis[e[i]] > dis[u.x] + w[i]) {
				dis[e[i]] = dis[u.x] + w[i];
				Node v(dis[e[i]],e[i]);
				q.push(v);
			}
		}
	}
}
 
int main() {
	memset(h,-1,sizeof(h));//
	cin>>n>>m>>s;
	for(int i=1; i<=m; i++) {
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
	}
 
	dijkstra();
 
	for(int i=1; i<=n; i++) {
		if(dis[i]==INF) cout<<"2147483647 ";
		else cout<<dis[i]<<" ";
	}
	return 0;
}

 

...全文
18 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

31,073

社区成员

发帖
与我相关
我的任务
社区描述
鸿蒙Next技术问题交流和学习资源共享中心
vue.js前端harmonyos 个人社区
社区管理员
  • 言程序plus
  • 小明-JavaAI
  • 叶落秋白
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

web全栈技术交流中心

试试用AI创作助手写篇文章吧