【ybtoj】【最短路】【Dijkstra】【堆】【例题1】单源最短路径

【例题1】单源最短路径


Link

传送门
题目


解题思路

STL的堆也太高深了吧,我以后还是手打堆来的舒服ヘ(_ _ヘ)

Dijkstra + 堆优化


Code

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define demo pair<int, int>

using namespace std;

struct DT{	
	int to, s, next;
}a[400100];
priority_queue<demo, vector<demo>, greater<demo> >q;  //大根堆

int n, m, S, x, y, s, num, now, dis[400100], head[400100], v[400100];

void dijkstra() {
	memset(dis, 0x3f, sizeof(dis));
	dis[S] = 0;
	q.push(make_pair(0, S));  //把dis[]放进堆里,每次找最小值就可以降到O(1),维护也只用O(lgn)
	while(!q.empty()) {
		now = q.top().second;
		q.pop();
		if (v[now]) continue;
		v[now] = 1;
		for (int i = head[now]; i; i = a[i].next) {
			if (v[a[i].to]) continue;
			if (dis[a[i].to] > dis[now] + a[i].s) {
				dis[a[i].to] = dis[now] + a[i].s;  //松弛
				q.push(make_pair(dis[a[i].to], a[i].to));  //把新的边丢入到堆里,因为新边一定小于旧边,所以没必要担心旧边
			}
		}
	}
}

int main() {
	scanf("%d %d %d", &n, &m, &S);
	for (int i = 1; i <= m; i++) {
		scanf("%d %d %d", &x, &y, &s);
		a[++num] = (DT){y, s, head[x]};
		head[x] = num;
	}
	dijkstra();
	for (int i = 1; i <= n; i++)
		printf("%d ", dis[i]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值