Aiuto per Cammino minimo (mincammino2)

Mi permetto di darti qualche consiglio non richiesto che ho trovato comodo:

  1. Puoi utilizzare i #define o, ancora meglio, gli using per accorciare il codice (in particolar modo la dichiarazione della priority queue). Riporto quelli che uso piu’ spesso:

    • using ll = long long;
    • using pill = pair<int, ll>;
    • using pll = pair<ll, ll>;
      Praticamente ogni volta che scrivi ll e’ come se scrivessi long long, quindi la dichiarazione della priority queue diventa
      priority_queue<pll, vector<pll>, greater<pll>> pq;
  2. Se ti serve prendere gli elementi di un pair in due variabili puoi usare la seguente notazione:
    auto[a, b] = mypair;
    Ad esempio, quando prendi i valori del nodo e della distanza dalla pq puoi usare:
    auto[dist, node] = pq.top();

  3. Se hai un vettore / array / set / qualunque cosa su cui vuoi iterare puoi usare la seguente notazione:
    for (auto x: V) {...}
    che e’ equivalente a fare for x in V: ... su python.
    Se vuoi modificare gli elementi di V basta che aggiungi un &:
    for (auto& x: V) {...}
    questo e’ ad esempio utile per prendere l’input dei programmi:
    for (auto& x: V) cin >> x;

  4. Per concludere volevo fare un piccolo chiarimento di dubbissima utilita’ sulla priority queue: tu giustamente dici che ordina “a partire dal primo”, ma piu’ nel dettaglio utilizza il comparatore che gli hai passato (ovvero greater<pair<long long, long long>>).
    In sostanza gli hai dato una funzione che, dati due pair, ti dice quale e’ “piu’ grande”.
    Il modo in cui li ordina e’ per il valore del primo e poi del secondo elemento (quindi {2, 0} < {2, 1} < {3, 1}), hence la pq e’ ordinata in questo modo.

Personalmente queste sono tante cose “non dette” che mi hanno aiutato tanto (e soprattutto mi hanno fatto sentire un figo quando le ho imparate), spero che possano esserti utili.

2 Mi Piace