#include <iostream>
#include <vector>
#include <climits>
using namespace std;
#define ll long long
int N, M, T, Res = INT32_MAX;
vector<int> V(200001, INT32_MAX);
void DFS(int S, int Calc, vector<int> Adj[], vector<int> RAdj[]) {
if(S == N-1) {
Res = min(Res, Calc);
return;
}
if(Calc >= V[S]) return;
V[S] = Calc;
if((Calc / T)%2 == 0) {
for(auto i : Adj[S]) DFS(i, Calc+1, Adj, RAdj);
for(auto i : RAdj[S]) DFS(i, (T*((Calc / T)+1))+1, Adj, RAdj);
} else {
for(auto i : RAdj[S]) DFS(i, Calc+1, Adj, RAdj);
for(auto i : Adj[S]) DFS(i, (T*((Calc / T)+1))+1, Adj, RAdj);
}
}
int solve(int N, int M, int T, int* S, int* E) {
vector<int> Adj[N+1], RAdj[N+1];
for(int i = 0; i < M; i++) {
Adj[S[i]].push_back(E[i]);
RAdj[E[i]].push_back(S[i]);
}
DFS(0, 0, Adj, RAdj);
if(Res == INT32_MAX) return -1;
else return Res;
}
Stavo cercando di sottoporre questo codice dandomi però 0/100 e dicendomi “Execution killed with signal 8 (could be triggered by violating memory limits)” quando però la memoria utilizzata rientra perfettamente nei limiti imposti dal problema. Ho pensato che il problema potesse essere dato da un overflow ma mi da lo stesso errore anche nel caso d’esempio che in locale il programma riesce a risolvere senza problemi. Qualcuno ha qualche idea per risolvere il problema?
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
#define ll long long
int N, M, T, Res = INT32_MAX;
vector<int> V(200001, INT32_MAX);
void DFS(int S, int Calc, vector<int> Adj[], vector<int> RAdj[]) {
if(S == N-1) {
Res = min(Res, Calc);
return;
}
if(Calc >= V[S]) return;
V[S] = Calc;
if(T != 0) {
if(Calc < T) {
for(auto i : Adj[S]) DFS(i, Calc+1, Adj, RAdj);
for(auto i : RAdj[S]) DFS(i, T+1, Adj, RAdj);
} else {
for(auto i : RAdj[S]) DFS(i, Calc+1, Adj, RAdj);
}
} else {
for(auto i : RAdj[S]) DFS(i, Calc+1, Adj, RAdj);
}
}
int solve(int N, int M, int T, int* S, int* E) {
vector<int> Adj[N+1], RAdj[N+1];
for(int i = 0; i < M; i++) {
Adj[S[i]].push_back(E[i]);
RAdj[E[i]].push_back(S[i]);
}
DFS(0, 0, Adj, RAdj);
if(Res == INT32_MAX) return -1;
else return Res;
}
Ho cambiato un po’ il codice poiché avevo capito male alcuni particolari del problema, tuttavia adesso mi trovo davanti ad un problema ancora più strano ovvero che mi da una sfilza di output errati compreso anche il caso d’esempio anche se in locale viene stampato il risultato corretto.
Se non passi alla funzione DFS() anche N e T il correttore continuerà a darti output errati perché avendoli dichiarati globali sono entrambi uguale a 0.
Ma quella di dichiarare solo variabili locali non è una regola da prendere sempre alla lettera, ad esempio, se dichiari le variabili Adj e RAdj globali non le devi riportare quando si implementa o si richiama la DFS().