当前位置: 代码迷 >> 综合 >> 洛谷 P3371 【模板】单源最短路径(弱化版)
  详细解决方案

洛谷 P3371 【模板】单源最短路径(弱化版)

热度:20   发布时间:2023-12-02 15:23:32.0

题目链接:https://www.luogu.com.cn/problem/P3371


这一题也是一道模版题,单源最短路问题;

使用spfa()算法做题。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;const int N = 10010, M = 500010, inf = 2147483647;int n, m, s;
int h[N], w[M], e[M], ne[M], idx;
int dist[N];
bool st[N];void add(int a, int b, int c){
    e[idx] = b;w[idx] = c;ne[idx] = h[a];h[a] = idx ++;
}void spfa(){
    for (int i = 1; i <= n; i ++ ) dist[i] = inf;dist[s] = 0;queue<int> q;q.push(s);st[s] = true;while (q.size()){
    int t = q.front();q.pop();st[t] = false;for (int i = h[t]; ~i; i = ne[i]){
    int j = e[i];if (dist[j] > dist[t] + w[i]){
    dist[j] = dist[t] + w[i];if (!st[j]){
    q.push(j);st[j] = true;}}}}
}
int main(){
    cin >> n >> m >> s;memset(h, -1, sizeof h);while (m -- ){
    int a, b, c; scanf("%d%d%d", &a, &b, &c);add(a, b, c);}spfa();for (int i = 1; i <= n; i ++ ) cout << dist[i] << " ";return 0;
}

堆优化版的dijkstra算法做这题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;const int N = 10010, M = 500010, inf = 2147483647;typedef pair<int, int> PII;int n, m, s;
int h[N], w[M], e[M], ne[M], idx;
int dist[N];
bool st[N];void add(int a, int b, int c){
    e[idx] = b;w[idx] = c;ne[idx] = h[a];h[a] = idx ++;
}void dijkstra(){
    for (int i = 1; i <= n; i ++ ) dist[i] = inf;dist[s] = 0;priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({
    0, s});//第一个表示距离,第二个表示点while (heap.size()){
    auto t = heap.top();heap.pop();int ver = t.second;st[ver] = true;for (int i = h[ver]; ~i; i = ne[i]){
    int j = e[i];if (dist[j] > dist[ver] + w[i]){
    dist[j] = dist[ver] + w[i];heap.push({
    dist[j], j});}}}
}
int main(){
    cin >> n >> m >> s;memset(h, -1, sizeof h);while (m -- ){
    int a, b, c; scanf("%d%d%d", &a, &b, &c);add(a, b, c);}dijkstra();for (int i = 1; i <= n; i ++ ) cout << dist[i] << " ";return 0;
}