Submission #981952

#TimeUsernameProblemLanguageResultExecution timeMemory
981952kilkuwuCrocodile's Underground City (IOI11_crocodile)C++17
100 / 100
398 ms74948 KiB
#include "crocodile.h"
 
#include <bits/stdc++.h>
 
#ifdef LOCAL
#include "template/debug.hpp"
#else
#define dbg(...) ;
#define timer(...) ;
#endif
 
int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]) {
#define int int64_t
  std::vector<std::vector<std::pair<int, int>>> adj(N);
 
  for (int i = 0; i < M; i++) {
    int u = R[i][0], v = R[i][1], w = L[i];
    adj[u].emplace_back(v, w);
    adj[v].emplace_back(u, w);
  }
 
  std::vector<std::pair<int, int>> dp(N, {1e9, 1e9});
 
  std::priority_queue<std::pair<int, int>> pq;
 
  for (int i = 0; i < K; i++) {
    dp[P[i]] = {0, 0};
    pq.emplace(0, P[i]);
  }
 
  auto update = [&](int u, int len) -> bool {
    if (len < dp[u].first) {
      int previous = dp[u].second;
      dp[u].second = dp[u].first;
      dp[u].first = len;
      return dp[u].second < previous;
    } else if (len < dp[u].second) {
      dp[u].second = len;
      return true;
    }
    return false;
  };

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

    if (d > dp[u].second) continue;
 
    for (auto [v, w] : adj[u]) {
      if (update(v, d + w)) {
        pq.emplace(-dp[v].second, v);
      }  
    }
  }
 
  return dp[0].second;
#undef int
}
 
 
 
#ifdef LOCAL
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_N 50000
#define MAX_M 10000000
 
static int N, M;
static int R[MAX_M][2];
static int L[MAX_M];
static int K;
static int P[MAX_N];
static int solution;
 
inline 
void my_assert(int e) {if (!e) abort();}
 
void read_input()
{
  int i;
  my_assert(3==scanf("%d %d %d",&N,&M,&K));
  for(i=0; i<M; i++)
    my_assert(3==scanf("%d %d %d",&R[i][0],&R[i][1],&L[i]));
  for(i=0; i<K; i++)
    my_assert(1==scanf("%d",&P[i]));
  my_assert(1==scanf("%d",&solution));
}
 
int main()
{
  int ans;
  read_input();
  ans = travel_plan(N,M,R,L,K,P);
  if(ans==solution)
    printf("Correct.\n");
  else
    printf("Incorrect. Returned %d, Expected %d.\n",ans,solution);
 
  return 0;
}
 
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...