Stavo provando a fare Bottleneck, ma mi dà soluzione errata in alcuni subtask (nel 4, nel 6 e nel 7 ne fallisce alcuni. Il subtask 5 invece funziona benissimo). Per il subtask 4 avevo pensato di individuare la posizione in righe/colonne di William e Luca, creare un “rettangolo” e individuare all’ interno di questo l’arco con peso minore, poichè è molto più veloce della soluzione che ho implementato per gli altri subtask. Per gli altri uso una BFS che cerca tutti i percorsi più corti tra W e L salvandosi il peso dell’arco più leggero di ogni percorso. Se poi il percorso arriva ad L nel numero minimo di passi(che scopro appena arrivo per la prima volta ad L), aggiorno la variabile minimo con minimo=min(minimo, arco_più_piccolo_del_percorso)
.
#include<bits/stdc++.h>
using namespace std;
const int oo = numeric_limits<int>::max();
int Analizza(int N, int M, int W, int L, int arco_da[], int arco_a[], int capacita[], int R, int C) {
vector<vector<pair<int, int>>> graph(N);
int minimo = oo;
W--; L--;
for(int i=0; i<M; i++){
graph[arco_da[i]-1].push_back({arco_a[i]-1, capacita[i]});;
graph[arco_a[i]-1].push_back({arco_da[i]-1, capacita[i]});;
}
if(R != -1){
// se sono nel subtask 4 utilizzo il metodo a "rettangolo"
pair<int, int> posW = {W%C, W/C};
pair<int, int> posL = {L%C, L/C};
int min_arch = oo;
pair<int, int> start = {min(posW.first, posL.first), min(posW.second, posL.second)};
pair<int, int> end = {max(posW.first, posL.first), max(posW.second, posL.second)};
// cerr << "Start: " << start.first + 1<< " " << start.second + 1 << endl;
// cerr << "End: " << end.first + 1 << " " << end.second + 1 << endl;
for(int i=start.first; i<=end.first; i++){
for(int j=start.second; j<=end.second; j++){
// cerr << "Iter: " << i + 1 << " " << j + 1 << " " << C*j + i << endl;
for(auto n: graph[C*j + i]){
if(n.first > (C*j + i) and n.first <= max(L, W) ){
// cerr << n.first << endl;
min_arch = min(min_arch, n.second);
}
}
}
}
return min_arch;
}else{
// BFS
vector<bool> esplorati(N);
queue<pair<int, int>> frontiera;
frontiera.push({W, oo});
pair<int, int> curr;
int size, i;
bool to_break = false;
while(true){
size = frontiera.size();
for(i=0; i<size; i++){
curr = frontiera.front();
frontiera.pop();
for(auto n: graph[curr.first]){
if(not esplorati[n.first]){
if(n.first == L){
to_break = true;
minimo = min({minimo, min(curr.second, n.second)});
}else{
frontiera.push({n.first, min(curr.second, n.second)});
esplorati[n.first] = true;
}
}
}
}
if(to_break) break;
}
}
return minimo;
}
Qualche idea?
Grazie Mille