使用邻接矩阵的dijkstra算法

时间:2013-11-18 18:28:06

标签: c algorithm dijkstra

我目前正在尝试为Dijkstras算法创建一个程序。我无法理解如何为算法创建图表。

我无法将其实现到图表中。

我想创建一个名为

的函数
add_edge(G, Source, destination, weight);

我想使用此函数创建我的图形,以便稍后创建随机图形。例如,我会这样做:

add_edge(G,1,2,3);
add_edge(G,1,6,5);
add_edge(G,2,3,7);
etc.

我想要做的第一件事就是创造G,但我不确定如何做到这一点。我想创建另一个名为construct的函数,它等于G,如:

G = construct(Vertices);

我只是不确定如何构建它。

如果有人能帮助我理解这两个功能,那将会很有帮助!

3 个答案:

答案 0 :(得分:3)

这是制作nx x ny数组的一种方法:

int **construct(int nx, int ny) {
    int **a = malloc(nx * sizeof(*a));
    for(int i = 0; i != ny; i++) {
        a[i] = calloc(ny, sizeof(int));
    }
    return a;
}

答案 1 :(得分:2)

什么是G ......? G是您的graph吗?或G matrix用于表示图表?拥有类似以下(伪)的东西是最有意义的:

// This is your graph, represented by a 2-d array.
// i would be your source (vertex)
// j would be your destination (vertex)
// graph[i][j] would be the weight of the edge between those two points

int graph[][];

// Then you could add an edge to your graph with the following:

add_edge(graph, source, destination, weight) {
  graph[source][destination] = weight;
}

// A specific example would be:

add_edge(graph, 10, 11, 5)

虽然您需要知道:C中的二维数组实际上是p类型的指针数组。

所以int **graph;

查看Charlie关于如何(特别)创建matrix of ints的答案。

答案 2 :(得分:2)

如果您要使用矩阵制作图表,请使用上述答案。否则,如果你打算使用结构体来构建它,也许这样的东西可以让你开始

typedef struct VertexT *VertexP;
struct VertexT
{
     /*the value of the current Vertex*/
     int vertex;

     /*pointer to a list of edges, each value being an end point since this
     is a directed graph*/
     EdgeP edges;

     /*pointer to a list of weights, each weight corresponding to each edge
     thus there should be an equal number of items in both lists or there
     is an error condition*/
     WeightP weights;
}

typedef struct GraphT *GraphP;
struct GraphT
{
     /*pointer to a list of vertices in the graph, should contain exactly
     n vertices, where n is the number of nodes in the graph*/
     VertexP vertices;
}

这绝不是唯一的方法,但我想提供一个struct方法作为使用严格矩阵的替代方法。如果它是稀疏图,则使用列表可以优化空间复杂度,而不是使用矩阵。希望有助于您入门。

注意:我使用了typedef,因为我发现使用VertexP或GraphP比struct * VertexT和struct * GraphT更容易阅读和理解,它比任何东西都更具风格。

刚刚看到有关addEdge()函数的编辑。如果您使用我的表示,您可以将伪代码看作是这样的:

addEdge(GraphP g, int source, int dest, int weight)
     test for g being null:
          if true, create a graph or throw exception
          if false, continue
     search for source in VertexP list:
          if true, 
               search for dest in edges
                    if true report error
                    if false add new edge and weight to list on the source VertexP
          if false, create new VertexP with source, dest, weight and add to list