Submission #1138045

#TimeUsernameProblemLanguageResultExecution timeMemory
1138045GabrielCrocodile's Underground City (IOI11_crocodile)C++20
0 / 100
0 ms320 KiB
#include "crocodile.h"
#include "bits/stdc++.h"
using namespace std;
struct Arista{
  long long Nodo, Peso;
};
struct Arista_completa{
  long long a, b, Peso;
};
struct Nodo_por_ver{
  long long Distancia, Nodo, Padre;
};
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 Arista_completa &a, const Arista_completa &b){
  if(a.Peso < b.Peso) return 1;
  if(a.Peso > b.Peso) return 0;
  if(a.a < b.a) return 1;
  if(a.a > b.a) return 0;
  return a.b < b.b;
}
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;
  if(a.Nodo < b.Nodo) return 1;
  if(a.Nodo > b.Nodo) return 0;
  return a.Padre < b.Padre;
}
multiset<Arista_completa> Lista_de_aristas;
vector< vector<Arista> > Grafo;
vector<bool> Salidas;
vector<long long> Veloz(long long n){
  vector<long long> Padres(n, -2), Distancias(n, 2222222222222222);
  set<Nodo_por_ver> Cola;
  Nodo_por_ver Inicio;
  Inicio.Distancia = 0;
  Inicio.Nodo = 0;
  Inicio.Padre = 0;
  Cola.insert(Inicio);
  while(!Cola.empty()){
    Nodo_por_ver Actual = *Cola.begin();
    Cola.erase(Cola.begin());
    if(Distancias[Actual.Nodo] > Actual.Distancia){
      Distancias[Actual.Nodo] = Actual.Distancia;
      Padres[Actual.Nodo] = Actual.Padre;
    } else continue;
    for(auto E: Grafo[Actual.Nodo]){
      if(Distancias[E.Nodo] > Distancias[Actual.Nodo] + E.Peso){
        //Distancias[E.Nodo] = Distancias[Actual.Nodo] + E.Peso;
        Nodo_por_ver Siguiente;
        Siguiente.Nodo = E.Nodo;
        Siguiente.Distancia = Distancias[Actual.Nodo] + E.Peso;
        Siguiente.Padre = Actual.Nodo;
        Cola.insert(Siguiente);
      }
    }
  }
  for(long long i = 0; i < n; i++){
    cout<<Distancias[i]<<" ";
  }
  return Padres;
}
long long Obtener_distancia(long long n){
  vector<long long> Padres(n, -2), Distancias(n, 2222222222222222);
  set<Nodo_por_ver> Cola;
  Nodo_por_ver Inicio;
  Inicio.Distancia = 0;
  Inicio.Nodo = 0;
  Inicio.Padre = 0;
  long long Menor = 2222222222222222;
  Cola.insert(Inicio);
  while(!Cola.empty()){
    Nodo_por_ver Actual = *Cola.begin();
    Cola.erase(Cola.begin());
    if(Distancias[Actual.Nodo] > Actual.Distancia){
      Distancias[Actual.Nodo] = Actual.Distancia;
      Padres[Actual.Nodo] = Actual.Padre;
    } else continue;
    for(auto E: Grafo[Actual.Nodo]){
      if(Distancias[E.Nodo] > Distancias[Actual.Nodo] + E.Peso){
        //Distancias[E.Nodo] = Distancias[Actual.Nodo] + E.Peso;
        Nodo_por_ver Siguiente;
        Siguiente.Nodo = E.Nodo;
        Siguiente.Distancia = Distancias[Actual.Nodo] + E.Peso;
        Siguiente.Padre = Actual.Nodo;
        Cola.insert(Siguiente);
      }
    }
  }
  for(long long i = 0; i < n; i++) if(Salidas[i]) Menor = min(Menor, Distancias[i]);
  return Menor;
}
int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]){
  long long n = N, m = M;
  Grafo.assign(n, {});
  Salidas.assign(n, 0);
  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;
    Arista_completa _1;
    _1.a = a.Nodo;
    _1.b = b.Nodo;
    _1.Peso = a.Peso;
    Lista_de_aristas.insert(_1);
    swap(_1.a, _1.b);
    Lista_de_aristas.insert(_1);
    Grafo[a.Nodo].push_back(b);
    Grafo[b.Nodo].push_back(a);
  }
  /*for(long long i = 0; i < K; i++) Salidas[P[i]] = 1;
  vector<long long> Padres = Veloz(n);
  Grafo.assign(n, {});
  for(long long i = 0; i < n; i++){
    Arista_completa _1;
    _1.a = i;
    _1.b = Padres[i];
    _1.Peso = -2;
    Arista a, b;
    a.Nodo = i;
    b.Nodo = Padres[i];
    a.Peso = (*Lista_de_aristas.lower_bound(_1)).Peso;
    b.Peso = a.Peso;
    Grafo[a.Nodo].push_back(b);
    Grafo[b.Nodo].push_back(a);*/
    /*Arista_completa a;
    a.a = i;
    a.b = Padres[i];
    a.Peso = -2;
    a.Peso = (*Lista_de_aristas.lower_bound(a)).Peso;
    Lista_de_aristas.erase(a);
    swap(a.a, a.b);
    Lista_de_aristas.erase(a);*/
  //}
  vector<long long> Distancias(n, 2222222222222222);
  deque<long long> Cola = {0};
  Distancias[0] = 0;
  int r = 0;
  while(!Cola.empty()){
    long long Nodo = Cola[0];
    Cola.pop_front();
    for(auto E: Grafo[Nodo]){
      if(Distancias[E.Nodo] > Distancias[Nodo] + E.Peso){
        Distancias[E.Nodo] = Distancias[Nodo] + E.Peso;
        r = max(r, (int)(Distancias[Nodo] + E.Peso));
        Cola.push_back(E.Nodo);
      }
    }
  }
  /*for(auto E: Lista_de_aristas){
    Arista a, b;
    a.Nodo = E.a;
    b.Nodo = E.b;
    a.Peso = E.Peso;
    b.Peso = E.Peso;
    Grafo[a.Nodo].push_back(b);
    Grafo[b.Nodo].push_back(a);
  }*/
  return r;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...