【题解-洛谷】P1339 [USACO09OCT] Heat Wave G

题目:P1339 [USACO09OCT] Heat Wave G

题目描述

有一个 n n n 个点 m m m 条边的无向图,请求出从 s s s t t t 的最短路长度。

输入格式

第一行四个正整数 n , m , s , t n,m,s,t n,m,s,t
接下来 m m m 行,每行三个正整数 u , v , w u,v,w u,v,w,表示一条连接 u , v u,v u,v,长为 w w w 的边。

输出格式

输出一行一个整数,表示答案。

输入输出样例 #1

输入 #1

7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

输出 #1

7

说明/提示

【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 2500 1\le n \le 2500 1n2500 1 ≤ m ≤ 6200 1\le m \le 6200 1m6200 1 ≤ w ≤ 1000 1\le w \le 1000 1w1000

【样例说明】
5 → 6 → 1 → 4 5 \to 6 \to 1 \to 4 5614 为最短路,长度为 3 + 1 + 3 = 7 3+1+3 = 7 3+1+3=7

代码

#include
#include
#include

using namespace std;

typedef pair<int, int> PII;
const int Maxn = 2500 + 10, Maxm = 6200 + 10;

int n, m, s, t, h[Maxn], e[Maxm * 2], ne[Maxm * 2], w[Maxm * 2], idx, dist[Maxn], st[Maxn];
priority_queue<PII, vector<PII>, greater<PII>> heap;

void init(){
    memset(h, -1, sizeof h);
}

void add(int a, int b, int c){
    e[idx] = b;
    w[idx] = c;
    ne[idx] = h[a];
    h[a] = idx ++;
}

int dijkstra(){
    memset(dist, 0x3f, sizeof dist);
    dist[s] = 0;
    heap.push({0, s});

    while(!heap.empty()){
        auto t = heap.top();
        heap.pop();
        int vec = t.second, distance = t.first;

        if(st[vec]){
            continue;
        }

        st[vec] = 1;
        for(int i = h[vec]; i != -1; i = ne[i]){
            int j = e[i];
            if(dist[j] > dist[vec] + w[i]){
                dist[j] = dist[vec] + w[i];
                heap.push({dist[j], j});
            }
        }
    }

    return dist[t];
}

int main(){
    cin >> n >> m >> s >> t;
    init();
    while(m --){
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c), add(b, a, c);
    }
    int res = dijkstra();
    cout << res;
    return 0;
}

结果

【题解-洛谷】P1339 [USACO09OCT] Heat Wave G_第1张图片
【题解-洛谷】P1339 [USACO09OCT] Heat Wave G_第2张图片

你可能感兴趣的:(算法练习题解,算法,图论,单源最短路径,堆优化版的dijkstra)