Sono giorni che non riesco fare 100 manco ad un problema, sto impazzendo, mi sembrava di aver avuto una buona idea su questo problema ma mi da output parzialmente corretto su qualche testcase dalla subtask 3 in poi. Il problema più grosso di tutti è che non ho idea del perchè non vada anche perchè non riesco a generare nessun testcase dove fallisce…
bool colora(int k, vector<int> &v, int node, int colore = 0){
v[node] = colore; // coloro il nodo
for(auto x : adj[node]){
if(v[x] == -1) { // se il nodo non è colorato, lo coloro.
if(!colora(k, v, x, (colore + 1) % k)) {
v[x] = -1;
return false; /* se colora() returna false allora non posso
} non posso usare k colori e devo returnare
false */
}
if(v[x] == colore) {
v[x] = -1;
return false; // se un vicino è dello stesso colore -> false
}
}
return true; // returno true solamente se non ho mai returnato false
}
void smista(int n, int nemico[]){
adj.resize(n, vector<int>());
for(int i = 0; i < n; ++i){
adj[i].push_back(nemico[i]);
adj[nemico[i]].push_back(i);
}
int l = 1, r = n+1;
vector<int> sol;
while(l < r){ // binary search per il primo k per cui colora() = true
int mid = (l + r) / 2;
vector<int> visited(n, -1);
bool f = true;
for(int i = 0; i < n; ++i){ // il grafo potrebbe avere più componenti
if(visited[i] != -1) continue;
if(!colora(mid, visited, i)) {
f = false;
break;
}
}
if(f){
r = mid;
sol = visited;
}else{
l = mid + 1;
}
}
for(int i = 0; i < l; ++i){
nuovo_gruppo();
for(int j = 0; j < n; ++j){
if(sol[j] == i) aggiungi(j);
}
}
}
Vi chiedo aiuto, a me sembra corretto, non so più a cosa pensare, grazie in anticipo.