Sto provando a risolvere https://training.olinfo.it/#/task/spesa/statement “spesa lampo” la mia idea iniziale era di usare dijkstra ma poi visto che i percorsi hanno tempo uguale ho usato una bfs visto che è un grafo non pesato.
La mia idea era quella di applicarla dal nodo 1 fino ai supermercati poi resettare tutto ma tenermi memorizzato quanti percorsi ho usato per i vari supermercati e poi applicarla di nuovo e quando visito un supermercato sommo i percorsi a quelli già trovati.
Il mio codice è questo qua:
#include <bits/stdc++.h>
using namespace std;
ifstream in ("input.txt");
ofstream out ("output.txt");
queue<int> coda;
bool visited[10005];
int disti[10005];
vector< vector < int > > g;
bool v[10005];
int main(){
int n, m, k, a, b, counter=0, minn=100005;
int minu[10005];
in >> n >> m >> k;
g.resize(n);
for(int i=0; i<k; i++){
in >> a;
v[a] = true;
minu[a] = 0;
}
for(int i=0; i<n; i++){
in >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
a = 1;
coda.push(a);
visited[a] = true;
while(!coda.empty()){
a = coda.front();
coda.pop();
for(int i=0; i<g[a].size(); i++){
if(!visited[g[a][i]]){
visited[g[a][i]] = true;
coda.push(g[a][i]);
disti[g[a][i]] = disti[a] + 1;
if(v[g[a][i]]){
counter++;
minu[g[a][i]] = disti[g[a][i]];
}
}
}
if(counter>=k)
break;
}
for(int i=0; i<=n; i++){
visited[i] = false;
}
for(int i=0; i<=n; i++){
disti[i] = 0;
}
a = n;
coda.push(a);
visited[a] = true;
counter = 0;
while(!coda.empty()){
a = coda.front();
coda.pop();
for(int i=0; i<g[a].size(); i++){
if(!visited[g[a][i]]){
visited[g[a][i]] = true;
coda.push(g[a][i]);
disti[g[a][i]] = disti[a] + 1;
if(v[g[a][i]]){
counter++;
minu[g[a][i]] = minu[g[a][i]] + disti[g[a][i]];
if(minn>minu[g[a][i]])
minn = minu[g[a][i]];
}
}
}
if(counter>=k)
break;
}
out << minn;
in.close();
out.close();
return 0;
}
Nella maggior parte dei testcase mi dà che il compilatore è triggerato perchè uso la memoria in modo losco (signal error 11), in alcuni output is not correct e l’ultimo me lo dà giusto.
Mi aiutereste a trovare l’errore?
Grazie in anticipo.