Uma implementação em C ++ do algoritmo Floyd

O algoritmo de Floyd, também conhecido como método de interpolação, é um algoritmo que usa a idéia de programação dinâmica para encontrar o caminho mais curto entre vários pontos de origem em um determinado gráfico ponderado .

Este artigo apresenta uma implementação em C ++ do algoritmo Floyd. Este algoritmo suporta entrada dinâmica de pontos e arestas e fornece descrições de interface

 

1 estrutura de dados

  • A estrutura de armazenamento de um gráfico não direcionado usa uma matriz de adjacência.
  • O peso de cada aresta é a distância entre dois pontos nessa aresta.

int ** d = NULL; // Matriz bidimensional, armazenando a soma dos pesos do caminho mais curto de dois pontos

int ** path = NULL; // array bidimensional, armazena o caminho mais curto entre dois pontos

int matrixSize = 0; // O número de vértices na figura

int arcSize = 0; // O número de arestas na figura

int isDigraph = 0; // O tipo de gráfico, seja um gráfico direcionado ou um gráfico não direcionado

2 Definição da interface

Defina a seguinte interface:

/ * Inicialize a estrutura de armazenamento

vertexNum: o número de vértices

arcNum: número de arestas * /

bool init (int vertexNum, int arcNum)

 

/ * Adicione uma aresta

start: o ponto inicial da aresta

fim: o fim da borda

peso: peso da aresta * /

bool addArc (int início, int final, peso int, bool isDigraph = false)

 

/ * Calcule o caminho mais curto entre todos os vértices * /

bool CalculatePath ()

 

/ * Retorne ao caminho mais curto entre dois pontos

start: o ponto de partida do caminho

end: o fim do caminho * /

bool getShortestPath (int start, int end)

 

Implementação de código-fonte 3

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAX 10000000

int ** d = NULL;
int ** caminho = NULL;
int matrixSize = 0;
int arcSize = 0;
int isDigraph = 0;
bool init (int vertexNum, int arcNum)
{
    matrixSize = vertexNum;
    arcSize = arcNum;

    d = (int **) malloc (vertexNum * sizeof (int *));
    memset (d, 0, vertexNum * sizeof (int *));
    for (int i = 0; i <vertexNum; i ++)
    {
         d [i] = (int *) malloc (vertexNum * sizeof (int));
         memset (d [i], 0, vertexNum * sizeof (int));
         
         for (int j = 0; j <vertexNum; j ++)
         {
             d [i] [j] = MAX;
         }
    }

    caminho = (int **) malloc (vertexNum * sizeof (int *));
    memset (caminho, 0, vertexNum * sizeof (int *));
    for (int i = 0; i <vertexNum; i ++)
    {
         caminho [i] = (int *) malloc (vertexNum * sizeof (int));
         memset (caminho [i], 0, vertexNum * sizeof (int));

         for (int j = 0; j <vertexNum; j ++)
         {
             caminho [i] [j] = -1;
         }
    }

    return true;
}

bool addArc (int início, int final, int peso, bool isDigraph = false)
{
    if (! isDigraph)
    {
        d [start] [end] = weight;
        d [fim] [início] = peso;
        caminho [início] [fim] = fim;
        caminho [final] [início] = início;
    }
    else
    {
        d [início] [final] = peso;
        caminho [início] [fim] = fim;
    }
}

bool     CalculatePath ()
{
para (int k = 0; k <tamanho da matriz; k ++)
        para (int i = 0; i <tamanho da matriz; i ++)
            para (int j = 0; j <tamanho da matriz; j ++) {
                if (d [i ] [k] + d [k] [j] <d [i] [j]) {
                    d [i] [j] = d [i] [k] + d [k] [j];
                    caminho [i] [j] = caminho [i] [k];
                }
            }

    return true;
}

bool getShortestPath (int início, int final)
{
    if ((início! = final) && (d [início] [final] <MAX))
    {
         printf ("% d ->% d:% d", início, fim , d [início] [fim]);
         printf ("caminho:");
         int f = início;
         int en = fim;
         while (f! = pt)
         {
             printf ("% d ->", f);
             f = caminho [f] [en];
         }
         printf ("% d \ n", en);
         return true;
     }
     else if ((início! = final) && (d [início] [final]> = MAX))
     {
         printf ("% d ->% d: SEM CAMINHO \ n", início, fim);
         retorna falso;
     }

     retorna falso;
}

int main ()
{
    int i, j, m, n;
    int x, y, z;
    printf ("entrada vertexNum arcNum isDigraph: \ n");
    scanf ("% d% d% d", & n, & m, & isDigraph);
     
    init (n, m); 

    for (i = 0; i <m; i ++) {
            printf ("arco de entrada com o startPoint endPoint weitht: \ n");
            scanf ("% d% d% d", & x, & y, & z);
            addArc (x, y, z, isDigraph);
    }
     
    CalculePath ();

    printf ("Liste todas as distâncias e caminhos mais curtos: \ n");
    for (i = 0; i <n; i ++)
    {
        for (j = 0; j <n; j ++)
        {
            getShortestPath (i, j);
        }
    }
    retornar 0;
}

Publicado 31 artigos originais · Gosto 3 · Visitas 2028

Acho que você gosta

Origin blog.csdn.net/lclfans1983/article/details/105391628
Recomendado
Clasificación