Witam,
mam problem z usunięciem problemu w rozwiązaniu zadania "Morskie opowieści" z XX Olimpiady Informatycznej (zadanie dostępne pod adresem https://szkopul.edu.pl/problemset/problem/CfSEK4ACOcAPaAfX29Fp7Tud/site/?key=statement).
Po raz pierwszy natknąłem się na błąd pt. "stack smashing detected", znalazłem co dokładnie go powoduje, jednak nie mogę zrozumieć przyczyny.
Kod wygląda tak:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 7;
const int INFTY = 2147483646;
struct wierzcholek
{
int koszt_do_wyszukiwanego;
int id;
};
wierzcholek tab[10*N];
class kolejka
{
int i, j;
public:
kolejka()
{
i = 0;
j = 0;
}
bool empty()
{
return (j-i) == 0;
}
void push(wierzcholek input)
{
tab[j++] = input;
}
wierzcholek front()
{
return tab[i];
}
void pop()
{
++i;
}
};
vector<int> polaczenia[2*N];
int min_koszt[N][2*N];
int n, m, k;
int main()
{
//wejscie i przygotowanie tablic:
scanf("%d %d %d", &n, &m, &k);
for (int i = 0; i < m; i++)
{
int a, b;
scanf("%d %d", &a, &b);
polaczenia[a].push_back(b+n);
polaczenia[b+n].push_back(a);
polaczenia[a+n].push_back(b);
polaczenia[b].push_back(a+n);
}
for (int i = 0; i < N; i++)
for (int j = 0; j < 2*N; j++)
min_koszt[i][j] = INFTY;
//---------------------
//obliczanie min_kosztow parzystych i nieparzystych:
for (int i = 1; i <= n; i++)
{
//uzupelniamy min_koszt[i] algorytmem BFS
kolejka kolejne_wierzcholki;
bitset<N> odwiedzony; odwiedzony.reset();
kolejne_wierzcholki.push(wierzcholek{0, i});
while(!kolejne_wierzcholki.empty())
{
wierzcholek aktualny = kolejne_wierzcholki.front(); kolejne_wierzcholki.pop();
if (odwiedzony[aktualny.id] == false)
{
odwiedzony[aktualny.id] = true;
min_koszt[i][aktualny.id] = aktualny.koszt_do_wyszukiwanego;
for (size_t j = 0; j < polaczenia[aktualny.id].size(); j++)
{
int syn_id = polaczenia[aktualny.id][j];
kolejne_wierzcholki.push(wierzcholek{aktualny.koszt_do_wyszukiwanego+1, syn_id});
}
}
}
}
//---------------------
//obsluga zapytan:
for (int i = 0; i < k; i++)
{
int port_startowy, port_koncowy, d;
scanf("%d %d %d", &port_startowy, &port_koncowy, &d);
int min_parzysty = min_koszt[port_koncowy][port_startowy];
int min_nieparzysty = min_koszt[port_koncowy][port_startowy+n];
if(d%2 == 0)
{
if(d >= min_parzysty)
printf("TAK");
else
printf("NIE");
}
else
{
if(d >= min_nieparzysty)
printf("TAK");
else
printf("NIE");
}
printf("\n");
}
//---------------------
return 0;
}
Problem wywołują linie:
57: polaczenia[a].push_back(b+n);
60: polaczenia[b].push_back(a+n);
a dokładniej dodanie +n. Nie mam jednak zielonego pojęcia dlaczego... Program wykonuje się poprawnie, zwraca wszystkie wyniki i jest ubijany przez system z w/w błędem. Ma ktoś pomysł co nie gra albo jak to można zdebugować?
W załączniku do pobrania przykładowy test który ubija program: wejscie.txt
Zakresy zmiennych na wejściu:
zmienna | wartości |
---|---|
n | 2 <= n <= 5000 |
m | 1 <= m <= 5000 |
k | 1 <= k <= 1000000 |
a | 1 <= a <= n |
b | 1 <= b <= n |