Ir ao conteúdo
  • Cadastre-se

Algoritmo de djkstra


Posts recomendados

Pessoal, estou com um problema, onde através de um arquivo txt eu deve criar um programa para mostrar o Numero de vizinhos, nós e distancia. E depois criar o algoritmo de djkstra dos minimos caminhos a partir de um ponto inicial, o problema é que o meu programa sempre pega o mesmo valor, qualquer caminho inicial que eu pego sempre vai para o ''0', nao sei aonde estou errando.

 

 void armazenar(){


    char texto[100], filename[100];
    int i,j;

    FILE *arq;
    
    strcpy(filename,"centro.txt");

    if((arq=fopen(filename,"rt"))==NULL){

        printf("Erro ao abrir arquivo: %s",filename);
    }

    for(i=0;i<this->n_nos;i++){
        for(j=0;j<this->n_nos;j++){
            fscanf(arq,"%[^;]; ",&texto);
            if(strcmp(texto,"0")!=0){
                no.no_adj.push_back(j);
                no.distancia.push_back(atof(texto));
                no.n_vizinhos++;
            }
            
        }

    }
    


    fclose(arq);

};
    void dijkstra(int no_inicial){

        int menor_distancia,posicao,linhas,colunas,contador,i,j,precedente;
        contador=0;
        std::vector<int>::iterator it;
        std::vector<float>::iterator ot;

        float **m;
        linhas=3;
        colunas=n_nos;

        m=(float**)calloc(linhas,sizeof(float*));//m=matriz da tabela la
              
        for(i=0;i<linhas;i++){
            m=(float*)calloc(colunas,sizeof(float));

        }


        m[2][no_inicial]=1;
        contador++;
        precedente=no_inicial;
        m[1][no_inicial]=precedente;


        while(contador<this->n_nos){
            ot=no[precedente].distancia.begin();
            for(it=no[precedente].no_adj.begin();it<no[precedente].no_adj.end();it++){
                if(m[2][*it]=0){

                    m[0][*it]+=*ot;
                    m[1][*it]=precedente;

                    ot++;
                }
                

            }
            
            menor_distancia= 20000;
            posicao=0;

            for(j=0;j<colunas;j++){
                
                if(m[0][j]>0 && m[2][j]==0 && m[0][j]<menor_distancia){
                    menor_distancia=m[0][j];
                    posicao=j;
                }
            }
            m[2][posicao]=1;
            contador++;
            precedente=posicao;

        }

    };

    };
 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...