ビウ小さな映画館「NOIP以上の2019の学校の入学試験。」

[タイトル]説明は
愚かなビウが街にやってきた小さな映画は、彼がそこにいることを発見\(N \)映画館、およびチケットの価格が異なる各映画は、映画の一部の間の双方向リンク道路がある、と思います映画を見るために少なくとも必要性を過ごすにはどのくらいの出発点として、それぞれの道で費やされるためにいくつかの必要性、小さなビウが知りたいと思った、彼の映画(もちろん、あなたも置く滞在することができます)。

[入力形式の
1行目の2つの整数\(N、M \)、\ (n-は\)映画館の都市の数を表し、\(m個\)は、映画の間の道路の合計数を表します。\(1 \のLeq \のLeq 100000,1 \のLeq M \のLeq 300000 \)N-
2行目:\(N- \)は正の整数、\(Iは\)正の整数で\(私は\ )シネマ運賃\(ヴァル[I] \) \(1 \のLeqヴァル[I] \のLeq \ 1000)
3〜M + 2つのラインの各ライン3つの正の整数、\(U、V、W \) シネマ表す\(U \)と映画を\(V \)の間にコストがある(\ W)\道路上で。\(1 \のLeq U、V \ n型のLeq ,. 1 \のLeq W \のLeq \ 1000)

[]出力形式の
出力\(N- \)行それぞれ正の整数。
最初の\(私は\)最初の行からの出力の正の整数表現\(私は\)映画館を開始するには、あなたはそれが映画の最小値を取るどのくらい見ることができます。

それがどのように見える蜃気楼困難
実際には、非常に簡単であると思われます

映画のいずれかに行くために映画館から開始すると、指定された映画館に戻って、その後、映画などを見て映画館の周りにどのような方法であると理解
して、あなたはポイントと、各仮想映画館とするも、右の間に仮想的な点確立すると考えることができます\を(ヴァル[I] \) すなわち、運賃)側からの\(私は\)劇場は、フィルムの最小コストが実際にする仮想点である見え始め\(私は\)最短
その後、ラインダイクストラで再度実行します

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
typedef long long ll;

ll read() {
    ll ret = 0, flag = 1;
    char ch = getchar();
    while (ch > '9' || ch < '0') {
        if (ch == '-') flag = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ret = (ret << 3) + (ret << 1) + (ch ^ '0');
        ch = getchar();
    }
    return ret * flag;
}

ll n, m, val[1000005], ans;
ll head[1000005], pre[1000005], to[1000005], dis[1000005], sz;
ll dist[1000005];
bool vis[100005];

void insert(ll u, ll v, ll w) {
    to[++sz] = v; dis[sz] = w; pre[sz] = head[u]; head[u] = sz;
}

void dijkstra(ll st) {
    priority_queue< pair<ll, ll> , vector< pair<ll, ll> > , greater< pair<ll, ll> > > q;
    q.push(make_pair(0, st));
    while (!q.empty()) {
        ll x = q.top().second;
        q.pop();
        if (vis[x]) continue;
        else vis[x] = 1;
        for (int i = head[x]; i; i = pre[i]) {
            ll y = to[i];
            if (dist[y] > dist[x] + dis[i]) {
                dist[y] = dist[x] + dis[i];
                q.push(make_pair(dist[y], y));
            }
        }
    }
}

int main() {
    n = read(); m = read();
    for (int i = 1; i <= n; i++) {
        val[i] = read();
        insert(0, i, val[i]);
    }
    for (int i = 1; i <= m; i++) {
        ll u, v, w;
        u = read(); v = read(); w = read();
        insert(u, v, w * 2);
        insert(v, u, w * 2);
    }
    ans = 0x7fffffff;
    for (int j = 1; j <= n; j++) {
        dist[j] = 0x7fffffff;
        vis[j] = 0;
    }
    dist[0] = 0;
    dijkstra(0);
    for (int i = 1; i <= n; i++) printf("%lld\n", dist[i]);
    return 0;
}

おすすめ

転載: www.cnblogs.com/ak-dream/p/AK_DREAM17.html