제출 #1328749

#제출 시각아이디문제언어결과실행 시간메모리
1328749hoangtien69공장들 (JOI14_factories)C++20
15 / 100
8089 ms54668 KiB
#include <bits/stdc++.h>
#include "factories.h"
using namespace std;

const int MAXN = 500005;
const long long INF = 1e18;

int n;
vector<pair<int, long long>> adj[MAXN];
long long dist[MAXN];

void dijkstra(int S, int X[])
{
    priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;

    for (int i = 0; i < n; i++)
    {
        dist[i] = INF;
    }

    for (int i = 0; i < S; i++)
    {
        dist[X[i]] = 0;
        pq.push({0, X[i]});
    }

    while (!pq.empty())
    {
        auto [d, u] = pq.top();
        pq.pop();

        if (d > dist[u]) continue;

        for (auto [v, w] : adj[u])
        {
            if (dist[v] > dist[u] + w)
            {
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }
}

void Init(int N, int A[], int B[], int D[])
{
    n = N;
    for (int i = 0; i < n; i++)
    {
        adj[i].clear();
    }
    for (int i = 0; i < n - 1; i++)
    {
        adj[A[i]].push_back({B[i], D[i]});
        adj[B[i]].push_back({A[i], D[i]});
    }
}

long long Query(int S, int X[], int T, int Y[])
{
    dijkstra(S, X);

    long long res = INF;
    for (int i = 0; i < T; i++)
    {
        if (dist[Y[i]] < res)
        {
            res = dist[Y[i]];
        }
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...