Maree a Venezia (Execution killed with signal 8 (could be triggered by violating memory limits))

#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?

Quell’errore potrebbe essere causato perchè in alcuni test case stai cercando di accedere a un indice del vettore che è al di fuori della sua capacità

Si, però mi da lo stesso errore anche al test di esempio e quello quando lo faccio partire sul mio computer lo risolve senza dare problemi

Alla funzione DFS() devi passare anche N e T.

#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.

Ok grazie all’inizio non mi era chiaro del perché la variabile globale rompeva tutto ma ora ho capito. Da oggi in poi solo variabili locali

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().