結果

問題 No.3561 Collect KCPC
コンテスト
ユーザー jastaway
提出日時 2026-05-28 12:10:03
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 453 ms / 6,000 ms
コード長 4,577 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 12,967 ms
コンパイル使用メモリ 460,708 KB
実行使用メモリ 43,776 KB
最終ジャッジ日時 2026-05-29 18:49:07
合計ジャッジ時間 24,006 ms
ジャッジサーバーID
(参考情報)
judge2_1 / judge1_1
純コード判定待ち
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
部分点1 10 % AC * 15
部分点2 20 % AC * 15
部分点3 20 % AC * 13
部分点4 50 % AC * 51
合計 100 点
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include "testlib.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MIN_N = 4;
const int MAX_N = 100'000;
const int MAX_M = 150'000;
const ll MAX_C = 1'000'000'000;

const ll INF = 1LL << 60;
using p2 = pair<ll, int>;
template<class T, class U> bool chmin(T& a, U b) { return a > b ? a = b, 1 : 0; }

int main(int argc, char* argv[]) {
    registerValidation(argc, argv);
    int N = inf.readInt(MIN_N, MAX_N, "N");
    inf.readSpace();
    int M = inf.readInt(1, MAX_M, "M");
    inf.readEoln();
    vector<vector<pair<int, ll>>> G(N), rG(N);
    vector<pair<int, int>> uvs(M);
    for(int i = 0; i < M; i++)
    {
        int u = inf.readInt(1, N, "U_"+to_string(i));
        inf.readSpace();
        int v = inf.readInt(1, N, "V_"+to_string(i));
        inf.readSpace();
        ll c = inf.readLong(1, MAX_C, "C_"+to_string(i));
        inf.readEoln();
        inf.ensuref(u != v, "U_i not V_i");
        u--; v--;
        G[u].emplace_back(v, c);
        rG[v].emplace_back(u, c);
        uvs[i] = {u, v};
    }
    sort(uvs.begin(), uvs.end());
    for(int i = 0; i < M - 1; i++) inf.ensuref(uvs[i] != uvs[i + 1], "(U_i, V_i) not (U_j, V_j)");
    string S = inf.readString(format("[A-Z]{%d,%d}", N, N), "S");
    inf.readEof();
    vector<ll> d1(N, INF);
    {
        priority_queue<p2, vector<p2>, greater<p2>> pq;
        d1[0] = 0;
        pq.emplace(0, 0);
        while(!pq.empty())
        {
            auto [d, n] = pq.top(); pq.pop();
            if(d1[n] < d) continue;
            for(auto [e, c] : G[n])
            {
                if(chmin(d1[e], d1[n] + c)) pq.emplace(d1[e], e);
            }
        }
    }
    vector<ll> dK(N, INF);
    {
        priority_queue<p2, vector<p2>, greater<p2>> pq;
        for(int i = 0; i < N; i++) if(S[i] == 'K')
        {
            dK[i] = d1[i];
            pq.emplace(d1[i], i);
        }
        while(!pq.empty())
        {
            auto [d, n] = pq.top(); pq.pop();
            if(dK[n] < d) continue;
            for(auto [e, c] : G[n])
            {
                if(chmin(dK[e], dK[n] + c)) pq.emplace(dK[e], e);
            }
        }
    }
    vector<pair<p2, p2>> dP1(N, {p2{INF, -1}, p2{INF, -1}}), dP2(N, {p2{INF, -1}, p2{INF, -1}});
    {
        priority_queue<pair<p2, int>, vector<pair<p2, int>>, greater<pair<p2, int>>> pq;
        for(int i = 0; i < N; i++) if(S[i] == 'C' && dK[i] < INF)
        {
            dP1[i].first = {dK[i], i};
            pq.emplace(p2{dK[i], i}, i);
        }
        while(!pq.empty())
        {
            auto [di, n] = pq.top(); pq.pop();
            auto [d, i] = di;
            if(dP1[n].second.first < d) continue;
            for(auto [e, c] : G[n])
            {
                if(dP1[e].first.first > d + c)
                {
                    if(dP1[e].first.second != i) dP1[e].second = dP1[e].first;
                    dP1[e].first = {d + c, i};
                    pq.emplace(p2{d + c, i}, e);
                }
                else if(dP1[e].second.first > d + c && dP1[e].first.second != i)
                {
                    dP1[e].second = {d + c, i};
                    pq.emplace(p2{d + c, i}, e);
                }
            }
        }
        for(int i = 0; i < N; i++) if(S[i] == 'C')
        {
            dP2[i].first = {0, i};
            pq.emplace(p2{0, i}, i);
        }
        while(!pq.empty())
        {
            auto [di, n] = pq.top(); pq.pop();
            auto [d, i] = di;
            if(dP2[n].second.first < d) continue;
            for(auto [e, c] : rG[n])
            {
                if(dP2[e].first.first > d + c)
                {
                    if(dP2[e].first.second != i) dP2[e].second = dP2[e].first;
                    dP2[e].first = {d + c, i};
                    pq.emplace(p2{d + c, i}, e);
                }
                else if(dP2[e].second.first > d + c && dP2[e].first.second != i)
                {
                    dP2[e].second = {d + c, i};
                    pq.emplace(p2{d + c, i}, e);
                }
            }
        }
    }
    ll ans = INF;
    for(int i = 0; i < N; i++) if(S[i] == 'P')
    {
        auto [pi1, pi2] = dP1[i];
        auto [p1, i1] = pi1;
        auto [p2, i2] = pi2;
        auto [qj1, qj2] = dP2[i];
        auto [q1, j1] = qj1;
        auto [q2, j2] = qj2;
        if(i1 != j1) chmin(ans, p1 + q1);
        if(i1 != j2) chmin(ans, p1 + q2);
        if(i2 != j1) chmin(ans, p2 + q1);
        if(i2 != j2) chmin(ans, p2 + q2);
    }
    if(ans == INF) cout << -1 << endl;
    else cout << ans << endl;
}
0