码迷,mamicode.com
首页 > 其他好文 > 详细

【校内训练2019-11-15】表演

时间:2019-11-15 14:34:00      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:template   ons   using   amp   main   har   air   ems   --   

【题目概括】

给定一个无向带权图,每一个点都有一个点权。

对于每一个点都询问从某一个点\(x\)到这个点的最短距离+\(x\)的点权最小值。

【思路要点】

  • 将每一个点的权值当前一开始的距离\(dis\)
  • 把所有点都当做起点,跑一遍最短路就可以了。

【代码】

#include <bits/stdc++.h>

#define REP(i, s, t) for (int i = s; i <= t; i++)
#define PER(i, s, t) for (int i = s; i >= t; i--)
#define FI first
#define SE second
#define mp make_pair
#define pb push_back

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

template <class T>
void chkmax(T& x, T y) {
    x = max(x, y);
}
template <class T>
void chkmin(T& x, T y) {
    x = min(x, y);
}

template <class T>
void re(T& x) {
    x = 0;
    char ch = 0;
    int f = 1;
    for (; !isdigit(ch); ch = getchar())
        if (ch == '-')
            f = -1;
    for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
    x *= f;
}

template <class T>
void pr(T x) {
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        pr(x / 10);
    putchar(x % 10 + 48);
}

const int N = 2e5 + 5;

struct _edge {
    int to, nt;
    ll w;
} E[N << 1];

struct Node {
    int u;
    ll d;
    bool operator<(const Node& rhs) const { return d > rhs.d; }
};

int n, m, edgeCnt;
int H[N];
ll dis[N];
bool vis[N];

void addEdge(int u, int v, ll w) {
    E[++edgeCnt] = (_edge){ v, H[u], w };
    H[u] = edgeCnt;
}

priority_queue<Node> q;

void dij() {
    memset(vis, 0, sizeof vis);
    for (int i = 1; i <= n; i++) q.push((Node){ i, dis[i] });
    while (!q.empty()) {
        int u = q.top().u;
        q.pop();
        if (vis[u])
            continue;
        vis[u] = 1;
        for (int e = H[u]; e; e = E[e].nt) {
            int v = E[e].to, w = E[e].w;
            if (dis[v] > dis[u] + w) {
                dis[v] = dis[u] + w;
                q.push((Node){ v, dis[v] });
            }
        }
    }
}

int main() {
    freopen("exciting.in", "r", stdin);
    freopen("exciting.out", "w", stdout);

    re(n), re(m);
    for (int i = 1; i <= m; i++) {
        int u, v;
        ll w;
        re(u), re(v), re(w);
        w <<= 1;
        addEdge(u, v, w), addEdge(v, u, w);
    }

    for (int i = 1; i <= n; i++) re(dis[i]);

    dij();

    for (int i = 1; i <= n; i++) pr(dis[i]), putchar(' ');
    return 0;
}

【校内训练2019-11-15】表演

标签:template   ons   using   amp   main   har   air   ems   --   

原文地址:https://www.cnblogs.com/chhokmah/p/11865643.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!