제출 #1271817

#제출 시각아이디문제언어결과실행 시간메모리
1271817flaming_top1Autobus (COCI22_autobus)C++20
70 / 70
249 ms4292 KiB
#include <bits/stdc++.h>

#define SPED                                                                                                           \
    ios_base::sync_with_stdio(false);                                                                                  \
    cin.tie(0);                                                                                                        \
    cout.tie(0);

#define endl "\n"
#define fi first
#define se second
#define lint long long
#define fami signed
#define lore main
#define freefire freopen
#define Data tuple<lint, int, int>

const lint INF = 0x1f1f1f1f1f1f1f1f;
const lint NEG = 0xE1E1E1E1E1E1E1E1;

using namespace std;

int n, m;
lint adj[75][75], dist[75][75][75]; // dist[s][k][t] (s to t, k diffrent roads, shortest way)

void dijkstra(int z, lint DIST[][75])
{
    DIST[0][z] = 0;
    priority_queue<Data, vector<Data>, greater<Data>> pq;
    pq.emplace(0, 0, z);
    while (!pq.empty())
    {
        auto [du, k, u] = pq.top();
        pq.pop();
        if (du > DIST[k][u])
            continue;

        for (int i = 1; i <= n; i++)
            if (i != u)
                if (DIST[k + 1][i] > DIST[k][u] + adj[u][i] and k + 1 <= n)
                {
                    DIST[k + 1][i] = DIST[k][u] + adj[u][i];
                    pq.emplace(DIST[k + 1][i], k + 1, i);
                }
    }
}

fami lore()
{
    SPED;
    memset(adj, 0x1f, sizeof adj);
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int l, r;
        lint w;
        cin >> l >> r >> w;
        adj[l][r] = min(adj[l][r], w); // có hướng
    }

    memset(dist, 0x1f, sizeof dist);
    for (int i = 1; i <= n; i++)
        dijkstra(i, dist[i]);

    for (int i = 1; i <= n; i++)
        for (int l = 1; l <= n; l++)
            for (int r = 1; r <= n; r++)
                dist[l][i][r] = min(dist[l][i][r], dist[l][i - 1][r]);

    int k, q;
    cin >> k >> q;
    k = min(k, n);

    while (q--)
    {
        int l, r;
        cin >> l >> r;
        cout << (dist[l][k][r] == INF ? -1 : dist[l][k][r]) << endl;
    }
}
// Let your soul wander where dreams are born.
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...