• 【Educational Codeforces Round 38】D. Buy a Ticket 堆优化Dijkstra


    题意

    给定一张无向图,对每个点$iin S$求$min_{jin S} {2 imes d(i,j)+a_j}$


    考虑多源多汇最短路会超时,换个角度考虑每个$j$,如果$j=i$,那么答案为$a_i$,如果有更优的方案,那么为$i$到$j$的一条路径加上$a_j$,将这个过程看成两条路径,并且将$a_j$独立为一条路径,就得到最短路算法中的松弛操作,可以建立一个超级源点,连向各点,边权为$a_i$,那么从源点跑一遍最短路之后就是每个点所求答案

    时间复杂度$O(nlog n)$

    代码

    #include <bits/stdc++.h>
    #define inf 0x7f7f7f7f
    using namespace std;
    typedef long long LL;
    typedef pair<LL, int> pli;
    const int N = 200010;
    int cnt, head[N], nxt[3 * N], to[3 * N];
    LL val[3 * N];
    inline void add_edge(int u, int v, LL w) {
        to[cnt] = v; val[cnt] = w; nxt[cnt] = head[u]; head[u] = cnt++;
    }
    int vis[N];
    LL dis[N];
    int n, m, x, y;
    LL z;
    inline void dijkstra(int s) {
        priority_queue<pli, vector<pli >, greater<pli > > pq;
        memset(vis, 0, sizeof(vis));
        memset(dis,0x3f,sizeof(dis)); dis[s] = 0;
        pq.push(make_pair(dis[s], s));
        while(!pq.empty()) {
            pli now = pq.top(); pq.pop();
            int u = now.second; if(vis[u]) continue; vis[u] = 1;
            for(int i = head[u]; ~i; i = nxt[i]) {
                int v = to[i];
                if(dis[v] > dis[u] + val[i]) {
                    dis[v] = dis[u] + val[i];
                    pq.push(make_pair(dis[v], v));
                }
            }
        }
    }
    int main() {
        cnt = 0; memset(head, -1, sizeof(head));
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= m; ++i) {
            scanf("%d%d%I64d", &x, &y, &z);
            add_edge(x, y, 2 * z); add_edge(y, x, 2 * z);
        }
        for(int i = 1; i <= n; ++i) {
            scanf("%I64d", &z);
            add_edge(0, i, z);
        }
        dijkstra(0);
        for(int i = 1; i <= n; ++i) {
            printf("%I64d%c", dis[i], i == n ? '
    ' : ' ');
        }
        return 0;
    }
    
  • 相关阅读:
    BZOJ1001 BJOI2006 狼抓兔子
    NOI2015 程序自动分析
    高斯消元法
    [POJ] 3666 Making the Grade
    [CODEVS] 2185 最长公共上升子序列
    [模板] LIS
    [CF] 219D Choosing Capital for Treeland
    [POJ] 2823 Sliding Window
    [BZOJ] 1072 [SCOI2007]排列perm
    [POJ] 1094 Sorting It All Out
  • 原文地址:https://www.cnblogs.com/ogiso-setsuna/p/8455400.html
Copyright © 2020-2023  润新知