dijkstra堆优化

_谦言万语 2022-08-14 22:01:34
加精
#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;
}

 

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

50,782

社区成员

发帖
与我相关
我的任务
社区描述
和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream-Y.ocean
  • ღCauchyོꦿ࿐
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

 刷题!

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