Submission #1150288

#TimeUsernameProblemLanguageResultExecution timeMemory
1150288Noname_1900Race (IOI11_race)C++20
21 / 100
3095 ms12092 KiB
#include "race.h"
using namespace std;
#include <bits/stdc++.h>
const int NMAX = 200000;
#define int long long
vector<pair<int, int>> chemins[NMAX];
struct T {
  int longueur, noeud, nbAretesPrises;
  T(int _1, int _2, int _3)
  {
    longueur = _1; noeud = _2; nbAretesPrises = _3;
  }
  bool operator<(const T & other) const {
    return longueur > other.longueur;
  }
};
#undef int
int dejaVu[NMAX];
int best_path(int N, int K, int H[][2], int L[])
{
  #define int long long
  for(int iC = 0; iC < N-1; iC++)
  {
    int a = H[iC][0], b = H[iC][1], longueur = L[iC];
    chemins[a].push_back({b, longueur});
    chemins[b].push_back({a, longueur}); 
  }
  int meill = NMAX;
  for(int iNoeud = 0; iNoeud < N; iNoeud++)
  {
      priority_queue<T> plusCourtNoeud;
      plusCourtNoeud.push(T(0, iNoeud, 0));
      while(plusCourtNoeud.size())
      {
        auto cas = plusCourtNoeud.top();
        plusCourtNoeud.pop();
        if(dejaVu[cas.noeud] == iNoeud+1) continue;
        if(cas.longueur > K)  break;
        if(cas.longueur == K)
        {
          meill = min(meill, cas.nbAretesPrises);
          continue;
        }  
        dejaVu[cas.noeud] = iNoeud+1;
        for(auto pro : chemins[cas.noeud])
        {
          plusCourtNoeud.push(T(cas.longueur+pro.second, pro.first, cas.nbAretesPrises+1));
        }

      
      }

  }
  if(meill == NMAX) meill = -1;
  return meill;
}

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