• CodeForces 【20C】Dijkstra?


    解题思路

    heap+Dijkstra就能过。注意边是双向边,要用long long。

    附上代码

    #include <iostream>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    typedef pair<long long, int> P;
    priority_queue<P, vector<P>, greater<P> > Q;
    typedef long long LL;
    const int maxnode = 1e5+3, maxedge = 2e5+5;
    int n, m, u[maxedge], v[maxedge], fir[maxnode], nx[maxedge], pre[maxnode], Ans[maxnode];
    LL w[maxedge], dis[maxedge], cnt, tot;
    inline void addedge(int x, int y, LL z) {
        nx[++cnt] = fir[x];
        fir[x] = cnt;
        u[cnt] = x, v[cnt] = y, w[cnt] = z;
    }
    inline void Dijkstra() {
        fill(dis+1, dis+1+n, 2147483647000);
        Q.push(P(0, 1));
        dis[1] = 0;
        int k;
        while (!Q.empty()) {
            P x = Q.top();
            Q.pop();
            if(x.first > dis[x.second]) continue;
            k = fir[x.second];
            while (k != -1) {
                if(dis[u[k]] + w[k] < dis[v[k]]) {
                    dis[v[k]] = dis[u[k]] + w[k];
                    pre[v[k]] = u[k];
                    Q.push(P(dis[v[k]], v[k]));
                }
                k = nx[k];
            }
        }
    }
    
    int main() {
        scanf("%d%d", &n, &m);
        memset(fir, -1, sizeof(fir));
        int x, y; LL z;
        for(int i=1; i<=m; i++) {
            scanf("%d%d%lld", &x, &y, &z);
            addedge(x, y, z);
            addedge(y, x, z);
        }
        Dijkstra();
        if(dis[n] == 2147483647000) {
            printf("-1
    ");
            return 0;
        }
        for(int i=n; i>=1; i=pre[i]) {
            Ans[++tot] = i;
        }
        for(int i=tot; i>=1; i--) printf("%d ", Ans[i]);
    }
  • 相关阅读:
    java集合归纳
    判断回文数
    29:四则运算计算表达式的值
    getOutString 输出弹出字符串
    两个字符串中不同元素的个数
    字符串各个字符ASCII值加5
    23:一个整数的二进制表示中有多少个1
    Java进程间通信
    转 双重检查锁定与延迟初始化
    Key-Value键值存储原理初识(NOSQL)
  • 原文地址:https://www.cnblogs.com/bljfy/p/9463851.html
Copyright © 2020-2023  润新知