Submission #1302119

#TimeUsernameProblemLanguageResultExecution timeMemory
1302119proplayerCrocodile's Underground City (IOI11_crocodile)C++20
100 / 100
259 ms50664 KiB
#include "crocodile.h"
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const int maxN = 1e6 + 5;
int n, m, k, p[maxN];
struct Tedge
{
    int u, v;
    ll w;
}
e[maxN];
vector<int> adj[maxN];
ll d1[maxN], d2[maxN];
struct Titem
{
    int v;
    ll dlab;
    bool operator < (const Titem& other) const
    {
        return dlab > other.dlab;
    }
    bool valid()
    {
        return dlab == d2[v];
    }
};
priority_queue<Titem> pq;
void Dijkstra()
{
    fill(d1 + 1, d1 + n + 1, 1e18);
    fill(d2 + 1, d2 + n + 1, 1e18);
    for (int i = 1; i <= k; ++i)
    {
        d1[p[i]] = d2[p[i]] = 0;
        pq.push({p[i], d1[p[i]]});
    }
    while (!pq.empty())
    {
        Titem tmp = pq.top(); pq.pop();
        if (!tmp.valid()) continue;
        int u = tmp.v;
        //cerr << u << " " << d2[u] << "\n";
        if (u == 1) return;
        for (int i : adj[u])
        {
            int v = e[i].u ^ e[i].v ^ u;
            if (d1[v] > d2[u] + e[i].w)
            {
                if (d1[v] < d2[v])
                {
                    d2[v] = d1[v];
                    pq.push({v, d2[v]});
                }
                d1[v] = d2[u] + e[i].w;
            }
            else if (d2[v] > d2[u] + e[i].w)
            {
                d2[v] = d2[u] + e[i].w;
                pq.push({v, d2[v]});
            }
        }
    }
}
int travel_plan(int N, int M, int R[][2], int L[], int K, int P[])
{
    n = N;
    m = M;
    k = K;
    for (int i = 1; i <= m; ++i)
    {
        e[i].u = R[i - 1][0] + 1;
        e[i].v = R[i - 1][1] + 1;
        e[i].w = L[i - 1];
        adj[e[i].u].push_back(i);
        adj[e[i].v].push_back(i);
    }
    for (int i = 1; i <= k; ++i)
    {
        p[i] = P[i - 1] + 1;
    }
    Dijkstra();
    return d2[1];
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...