1
Good night, I’m having a question how to change the reading of the txt file, where the compiler identifies with char but within the file that need read, possessed only numbers, someone could help me ?
Attached is the error you are reporting.
using namespace std;
class Grafo
{
private:
int V; // numero de vertices
// ponteiro para um array contendo as listas de adjacencias
list<pair<int, int> > * adj;
public:
// construtor
Grafo(int V)
{
this->V = V; // atribui o numero de vertices
/*
cria as listas onde cada lista é uma lista de pairs
onde cada pai r é formado pelo vértice destino e o custo
*/
adj = new list<pair<int, int> >[V];
}
// adiciona uma aresta ao grafo de v1 a v2
void addAresta(int v1, int v2, int custo)
{
adj[v1].push_back(make_pair(v2, custo));
}
// algoritmo de Dijkstra
int dijkstra(int orig, int dest)
{
// vetor de distancias
int dist[V];
/*
vetor de visitados serve para caso o vertice ja¡ tenha sido
expandido (visitado), nao expandir mais
*/
int visitados[V];
// fila de prioridades de pair (distancia, vertice)
priority_queue < pair<int, int>,
vector<pair<int, int> >, greater<pair<int, int> > > pq;
// inicia o vetor de distancias e visitados
for(int i = 0; i < V; i++)
{
dist[i] = INFINITO;
visitados[i] = false;
}
// a distancia de orig para origem 0
dist[orig] = 0;
// insere na fila
pq.push(make_pair(dist[orig], orig));
// loop do algoritmo
while(!pq.empty())
{
pair<int, int> p = pq.top(); // extrai o pair do topo
int u = p.second; // obtem o vertice do pair
pq.pop(); // remove da fila
// verifica se o vertice nao foi expandido
if(visitados[u] == false)
{
// marca como visitado
visitados[u] = true;
list<pair<int, int> >::iterator it;
// percorre os vertices "v" adjacentes de "u"
for(it = adj[u].begin(); it != adj[u].end(); it++)
{
// obtem o vertice adjacente e o custo da aresta
int v = it->first;
int custo_aresta = it->second;
// relaxamento (u, v)
if(dist[v] > (dist[u] + custo_aresta))
{
// atualiza a distancia de "v" e insere na fila
dist[v] = dist[u] + custo_aresta;
pq.push(make_pair(dist[v], v));
}
}
}
}
// retorna a distancia minima ate o destino
return dist[dest];
}
};
int main(int argc, char *argv[])
{
int indicei, indicej, mat[5][5];
for (indicei=0; indicei<5;indicei++){
for(indicej=0 ; indicej<5; ++indicej){
FILE *file;
file = fopen("C:\\Users\\VINICIUSBENTOMARQUES\\Desktop\\Trabalho IA\\Trabalho IA\\cidades.txt", "r");
if(file == NULL){
printf("Não foi possível abrir o arquivo.\n");
getchar();
exit(0);
}
char numeros[1000];
while(fgets(numeros, 1000, file) != NULL){
printf("%s", numeros);
}
fclose(file);
Grafo g(5);
g.addAresta(indicei, indicej, mat[indicei,indicej]);
cout << fprintf(file,"%i", g.dijkstra(mat[indicei,indicej])) <<endl;
}
}
return 0;
}
Always put the error in text also so that it is searchable and preferably in the question title as well. What the error indicates is that it has no function with the name
dijkstra
receive the parameters you are passing (aint[]
). This looks like typo because you haveg.dijkstra(mat[indicei,indicej]))
instead ofg.dijkstra(mat[indicei][indicej]))
– Isac