#include "crocodile.h"
#include "bits/stdc++.h"
using namespace std;
struct Arista{
  long long Nodo, Peso;
};
struct Nodo_por_ver{
  long long Distancia, Nodo;
};
bool operator<(const Arista &a, const Arista &b){
  if(a.Peso < b.Peso) return 1;
  if(a.Peso > b.Peso) return 0;
  return a.Nodo < b.Nodo;
}
bool operator<(const Nodo_por_ver &a, const Nodo_por_ver &b){
  if(a.Distancia < b.Distancia) return 1;
  if(a.Distancia > b.Distancia) return 0;
  return a.Nodo < b.Nodo;
}
int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]){
  long long n = N, m = M;
  vector< vector<Arista> > Grafo(n);
  for(long long i = 0; i < m; i++){
    Arista a, b;
    a.Nodo = R[i][0];
    b.Nodo = R[i][1];
    a.Peso = L[i];
    b.Peso = a.Peso;
    Grafo[a.Nodo].push_back(b);
    Grafo[b.Nodo].push_back(a);
  }
  vector< pair<long long, long long> > Distancias(n, make_pair(-2, -2));
  multiset<Nodo_por_ver> Cola;
  vector<bool> Visitados(n, 0);
  for(long long i = 0; i < K; i++){
    Distancias[P[i]].first = 0;
    Nodo_por_ver a;
    a.Nodo = P[i];
    a.Distancia = 0;
    Cola.insert(a);
  }
  while(!Cola.empty()){
    Nodo_por_ver Actual = *Cola.begin();
    Cola.erase(Cola.begin());
    bool Sirve = 0;
    long long Caminos_que_sirven = 0;
    if(Distancias[Actual.Nodo].first > Distancias[Actual.Nodo].second) swap(Distancias[Actual.Nodo].first, Distancias[Actual.Nodo].second);
    if(Distancias[Actual.Nodo].first == -2) swap(Distancias[Actual.Nodo].first, Distancias[Actual.Nodo].second);
    if(Distancias[Actual.Nodo].first != -2) Caminos_que_sirven++;
    if(Distancias[Actual.Nodo].second != -2) Caminos_que_sirven++;
    if(Caminos_que_sirven == 0) Distancias[Actual.Nodo].first = Actual.Distancia;
    else if(Caminos_que_sirven == 1){
      Sirve = 1;
      Distancias[Actual.Nodo].second = Actual.Distancia;
    } else {
      if(Actual.Distancia <= Distancias[Actual.Nodo].second){
        Sirve = 1;
        Distancias[Actual.Nodo].second = Actual.Distancia;
        if(Distancias[Actual.Nodo].first > Distancias[Actual.Nodo].second) swap(Distancias[Actual.Nodo].first, Distancias[Actual.Nodo].second);
      }
    }
    if(Visitados[Actual.Nodo]) Sirve = 0;
    if(Actual.Nodo == 0) Sirve = 0;
    if(!Sirve) continue;
    Actual.Distancia = Distancias[Actual.Nodo].second;
    Visitados[Actual.Nodo] = 1;
    for(auto E: Grafo[Actual.Nodo]){
      Nodo_por_ver Nuevo;
      Nuevo.Distancia = Actual.Distancia + E.Peso;
      Nuevo.Nodo = E.Nodo;
      if(!Visitados[E.Nodo]) Cola.insert(Nuevo);
    }
  }
  return (int)max(Distancias[0].first, Distancias[0].second);
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |