Marcus Aseth
Utente Attivo
- Messaggi
- 408
- Reazioni
- 138
- Punteggio
- 60
Stavo cercando di risolvere questo "puzzle" su hackerrank.com chiamato Roads and Libraries e la mia soluzione è il codice sotto.
Il codice passa con successo i primi 3 "test case", però fallisce gli altri perchè impiega troppo tempo ad eseguire.
Per spiegare il mio ragionamento (che però è uno spoiler al problema, quindi magari prima provate a risolverlo da voi e non leggete oltre :) )
Il mio problema dunque penso stia nel codice che organizza le città in clusters, semplicemente impiega troppo tempo.
C'è un modo più efficiente/veloce per individuare il numero di clusters di città?
Attenzione, non chiedo la risposta per poter passare il problema, chiedo perchè altrimenti ho perso tempo a cercare di risolverlo e non ho imparato nulla di nuovo :|
Il codice passa con successo i primi 3 "test case", però fallisce gli altri perchè impiega troppo tempo ad eseguire.
Per spiegare il mio ragionamento (che però è uno spoiler al problema, quindi magari prima provate a risolverlo da voi e non leggete oltre :) )
Ci sono solo 2 soluzioni possibili, la prima è che una sola città ha una libreria e tutte le altre sono connesse da strade, il secondo caso è che tutte le città hanno la propria libreria.
Questo ragionamento però si applica a "clusters" di città, perchè ci possono essere piccoli gruppi di città isolate dalle altre.
Percui il mio algoritmo prima di tutto costruisce una mappa di questi "clusters" di città, e poi applica la formula sopra in base al numero di clusters.
Questo ragionamento però si applica a "clusters" di città, perchè ci possono essere piccoli gruppi di città isolate dalle altre.
Percui il mio algoritmo prima di tutto costruisce una mappa di questi "clusters" di città, e poi applica la formula sopra in base al numero di clusters.
C'è un modo più efficiente/veloce per individuare il numero di clusters di città?
Attenzione, non chiedo la risposta per poter passare il problema, chiedo perchè altrimenti ho perso tempo a cercare di risolverlo e non ho imparato nulla di nuovo :|
C++:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class City {
public:
City(long id) :ID{ id } {}
public:
long ID;
vector<long> connectedID;
};
int main()
{
long queryN;
cin >> queryN;
long cityN, roadN, libCost, roadCost;
for (size_t i = 0; i < queryN; i++)
{
cin >> cityN >> roadN >> libCost >> roadCost;
vector<City> Cities;
//make Cities
for (size_t i = 0; i < cityN; i++) {
Cities.push_back(City(i));
}
//make Roads
for (size_t i = 0; i < roadN; i++) {
long from, to;
cin >> from >> to;
from--, to--;
Cities[from].connectedID.push_back(to);
Cities[to].connectedID.push_back(from);
}
//organize cities by connected clusters
vector<vector<City*>> Clusters;
vector<bool> sorted(cityN);
for (size_t currCity = 0; currCity < cityN; currCity++)
{
if (!sorted[currCity])
{
for (auto& vecC : Clusters) {
if (sorted[currCity]) { break; }
for (auto& city : vecC) {
if (sorted[currCity]) { break; }
for (auto& connection : city->connectedID) {
if (connection == currCity)
{
vecC.push_back(&Cities[currCity]);
sorted[currCity] = true;
break;
}
}
}
}
//still not sorted, means it is not connected to an existing cluster
if (!sorted[currCity])
{
Clusters.push_back(vector<City*>(1, &Cities[currCity]));
sorted[currCity] = true;
}
}
}
//calculate expenses
long totalCost{};
//minimum 1 library per cluster of cities
totalCost += libCost*Clusters.size();
//other cities
totalCost += libCost < roadCost ? libCost*(cityN - Clusters.size()) : roadCost*(cityN - Clusters.size());
cout << totalCost << endl;
}
return 0;
}