Submission #1344819

#TimeUsernameProblemLanguageResultExecution timeMemory
1344819lanternerCrocodile's Underground City (IOI11_crocodile)C++20
100 / 100
226 ms72968 KiB
#include <bits/stdc++.h>
#include "crocodile.h"

using namespace std;

#define ll long long
#define ii pair<ll, ll>
#define ff first
#define ss second
#define fto(i, a, b, x) for (int i = a; i <= b; i += x)

const ll MAXN = 100005; // N la 10^5
const ll INF = 1e16;    // Dung 1e16 de an toan khi cong w

vector<ii> dothi[MAXN];
ll dist1[MAXN], dist2[MAXN];
bool visited[MAXN];

void dijkstra(int n, int k, int p[]) {
    priority_queue<ii, vector<ii>, greater<ii>> pq;
    
    fto(i, 0, n, 1) {
        dist1[i] = dist2[i] = INF;
        visited[i] = false;
    }

    fto(i, 0, k - 1, 1) {
        int u = p[i];
        dist1[u] = dist2[u] = 0;
        pq.push({0, u});
    }

    while (!pq.empty()) {
        ll d = pq.top().ff;
        int u = (int)pq.top().ss;
        pq.pop();

        if (d > dist2[u] || visited[u]) continue;
        visited[u] = true;

        for (auto &edge : dothi[u]) {
            int v = (int)edge.ff;
            ll w = d + edge.ss;

            if (w < dist1[v]) {
                dist2[v] = dist1[v];
                dist1[v] = w;
                if (dist2[v] != INF) pq.push({dist2[v], v});
            } else if (w < dist2[v]) {
                dist2[v] = w;
                pq.push({dist2[v], v});
            }
        }
    }
}

int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]) {
    // Luon xoa du lieu cu o dau ham
    fto(i, 0, N, 1) dothi[i].clear();

    fto(i, 0, M - 1, 1) {
        int u = R[i][0], v = R[i][1];
        ll w = L[i];
        dothi[u].push_back({v, w});
        dothi[v].push_back({u, w});
    }

    dijkstra(N, K, P);

    return (int)dist2[0]; // Entrance luon la 0 theo de bai
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...