Buonasera.
Sto provando a risolvere questo problema, ma non riesco a capire dov’è l’errore.
L’idea dell’algoritmo è quella di rappresentare le città come un albero, prendendo la prima come root, e trovando tutte le congestioni delle varie strade e prendere la minima alla fine.
Credo che ci sia qualche errore in come implemento l’albero, ma non so come correggerlo. Potete aiutarmi voi?
Questo è il codice:
#include <fstream>
#include <vector>
#include <algorithm>
#define MAXN 1000000
using namespace std;typedef struct s{
int nd;
int sum;
int mass;vector<s*> figli;
} nodo;
nodo* cities[MAXN];
int congestions[MAXN], N;int sum(nodo* root){
int mass = 0;for(int i=0; i < root->figli.size(); i++){ root->sum += sum(root->figli[i]); if(root->figli[i]->sum > root->mass) root->mass = root->figli[i]->sum; } return root->sum;
}
void solve(nodo* root){
congestions[root->nd] = max(cities[0]->sum - root->sum, root->mass);
for(int i=0; i<root->figli.size(); i++)
solve(root->figli[i]);
}int main(){
ifstream in(“input.txt”);
in >> N;for(int i=0; i<N; i++){ cities[i] = (nodo*)malloc(sizeof(nodo)); in >> cities[i]->sum; cities[i]->nd = i; cities[i]->mass = 0; } for(int i=0, t1, t2; i<N-1; i++){ in >> t1 >> t2; cities[t1]->figli.push_back(cities[t2]); } in.close(); sum(cities[0]); solve(cities[0]); ofstream out("output.txt"); out << *min_element(congestions, congestions+N) << "\n"; out.close(); return 0;
}