ybtoj最短路Dijkstra堆例题1单源最短路径
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ybtoj最短路Dijkstra堆例题1单源最短路径相关的知识,希望对你有一定的参考价值。
Link
解题思路
STL的堆也太高深了吧,我以后还是手打堆来的舒服ヘ(_ _ヘ)
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单源最短路径的主要内容,如果未能解决你的问题,请参考以下文章
hdu 2544 单源最短路问题 dijkstra+堆优化模板