• 【Codeforces 20C】 Dijkstra?


    【题目链接】

               点击打开链接

    【算法】

              dijkstra

    【代码】

             

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll INF = 1e15;
    const ll MAXN = 1e5;
    
    ll n,m,u,v,w,i,p,to,cost,x;
    ll dist[MAXN+10],vis[MAXN+10],last[MAXN+10];
    priority_queue< pair<ll,ll> > q;
    vector< pair<ll,ll> > E[MAXN+10];
    vector<ll> path;
    
    template <typename T> inline void read(T &x) {
            ll f = 1; x = 0;
            char c = getchar();
            for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
            for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
            x *= f;
    }
    template <typename T> inline void write(T x) {
            if (x < 0) { x = -x; putchar('-'); }
            if (x > 9) write(x/10);
            putchar(x%10+'0');    
    }
    template <typename T> inline void writeln(T x) {
            write(x);
            puts("");    
    }
    
    int main() {
        
        read(n); read(m);
        for (i = 1; i <= m; i++) {
                read(u); read(v); read(w);
                E[u].push_back(make_pair(v,w));
                E[v].push_back(make_pair(u,w));
        }
        for (i = 2; i <= n; i++) dist[i] = INF;
        q.push(make_pair(0,1));
        while (!q.empty()) {
                x = q.top().second; q.pop();
                if (vis[x]) continue;    
                vis[x] = 1;
                for (i = 0; i < E[x].size(); i++) {
                        to = E[x][i].first;
                        cost = E[x][i].second;
                        if (dist[x] + cost < dist[to]) {
                                dist[to] = dist[x] + cost;
                                q.push(make_pair(-dist[to],to));
                                last[to] = x;
                        }
                }
        }
        
        if (dist[n] == INF) {
                puts("-1");
                return 0;
        }
        
        p = n;
        while (p) {
                path.push_back(p);
                p = last[p];
        }
        
        reverse(path.begin(),path.end());
        
        for (i = 0; i < path.size(); i++) {
                write(path[i]);
                if (i < path.size() - 1) putchar(' ');    
        }
        
        return 0;
    }
  • 相关阅读:
    牛牛的揠苗助长(二分)
    树型DP简单入门
    Rational Ratio(一道思维题)
    Tima goes to Xentopia(条件最短路)
    中国剩余定理
    求解逆元的三种方法
    samba 基本配置及自定义控制
    vue之虚拟DOM、diff算法
    vue-cli3构建ts项目
    VMware+node+nginx+vue
  • 原文地址:https://www.cnblogs.com/evenbao/p/9196387.html
Copyright © 2020-2023  润新知