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

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]);
}

以上是关于ybtoj最短路Dijkstra堆例题1单源最短路径的主要内容,如果未能解决你的问题,请参考以下文章

用小根堆实现dijkstra,求图的单源最短路径

Dijkstra:正边权单源最短路算法

hdu 2544 单源最短路问题 dijkstra+堆优化模板

P4779 模板单源最短路径(标准版)二叉堆优化的 Dijkstra

Bellman-ford 单源最短路径算法

Dijkstra算法求单源最短路