Qual é a melhor estrutura de dados padrão para construir um gráfico?

de início, sou um principiante em C++ e estou a aprender a si próprio, por isso, por favor, seja muito simples nas respostas ...

Preciso de programar um grafo que contenha nós cada nó tem o id e a lista de arestas cada aresta tem o id do outro nó e a distância

o que estou à procura é o que devo usar para construir este gráfico considerando que quero usar o algoritmo de dijkstra para obter o caminho mais curto de um ponto para o outro ... por isso, procurar desempenho deve ser o mais importante pensa !!

Já procurei muitas vezes e agora estou tão confusa.

obrigado antecipadamente pela ajuda

Author: unkulunkulu, 2011-07-29

3 answers

Podes definir uma estrutura Edge Como

struct Edge
{
    int destination;
    int weight;
};

E criar um gráfico como

vector<vector<Edge> > graph;

Então para acessar todas as arestas que vêm do vértice u, você escreve algo como

for( int i = 0; i < graph[u].size(); ++i ) {
    Edge edge = graph[u][i];
    // here edge.destination and edge.weight give you some details.
}

Pode-se adicionar dinamicamente novas arestas, por exemplo uma aresta do 3º vértice ao 7º com um peso de 8:

Edge newEdge;
newEdge.destination = 7;
newEdge.weight = 8;
graph[3].push_back( newEdge );

Etc.

Para grafos não direcionados não deve esquecer-se de adicionar a aresta simétrica, é claro.

Isto deve servir. bem.

Editar Escolha dos contentores de base(std::vector, std::list, std::map) depende do caso de uso, por exemplo, o que você está fazendo com o grafo mais frequentemente: Adicionar/Remover vértices/arestas, apenas atravessando. Uma vez que seu grafo é criado, std::list ou std::vector é igualmente bom para Dijkstra, std::vector sendo um pouco mais rápido graças ao padrão de acesso sequencial do estágio de relaxamento.

 11
Author: unkulunkulu, 2011-07-29 20:07:43

Um grafo que contém Nós cada nó tem id e lista de arestas cada aresta tem o outro nó id e a distância

Se considerarmos cada identificador de nó como um índice. Podemos desenhar uma matriz nxn das bordas da seguinte forma.

Isto pode ajudá-lo a desenhar o gráfico com as arestas.

     [0][1][2][3]

[0] | 1  0  0  0|
[1] | 0  0  1  0|
[2] | 1  0  0  1|
[3] | 0  0  1  0|

Então, uma matriz 2D é uma boa representação da matriz.

int maxtrix[4][4] = new int[4][4];
 0
Author: Sorter, 2018-03-24 09:41:10
Eu, pessoalmente, usaria um std::map<Node*, std::set<Node*> >. Isto é extremamente útil porque cada vez que você está em um nó, você pode rapidamente descobrir a que nós esse nó está conectado. Também é muito fácil de iterar sobre todos os nós, se você precisar. Se precisar de colocar pesos nas bordas, pode usar std::map<Node*, std::set< std::pair<int, Node*> > >. Isto dará muito melhor desempenho do que usar vetores, especialmente para grafos grandes.
 -1
Author: setholopolus, 2017-11-20 21:17:57