【问题标题】:kruskal implement in c adjacency list or adjacency matrixkruskal 在 c 邻接列表或邻接矩阵中实现
【发布时间】:2012-12-09 14:31:55
【问题描述】:

我正在阅读教科书Introduction to Algorithms aka CLRS,我想在c 中使用kruskal 算法实现mst,我想知道的是,我应该使用哪个图形实现,邻接列表或邻接矩阵?我认为在使用邻接列表时对edges 进行排序并不直观,这样定义邻接列表时,邻接列表中edge 的表示会令人困惑:

typedef struct tagAdjList
{
    int endPointIndex;
    struct tagAdjList * next;
}AdjNode, *AdjList, *AdjPNode;

在对边进行排序时,我想使用指向上面定义的节点的指针数组,问题是上面定义的结构找不到边的start point,而是找到end point。所以我改变了这样的结构:

typedef struct tagAdjList
{
    int startPointIndex;
    int endPointIndex;
    struct tagAdjList * next;
}AdjNode, *AdjList, *AdjPNode;

我想问的是:这样定义邻接表可以吗?还是有更好的做法?或者我应该使用邻接矩阵(因为我看到有些人在搜索互联网时使用矩阵实现 kruskal)?为什么? 对不起英语不好。任何帮助将不胜感激。

【问题讨论】:

    标签: c algorithm graph kruskals-algorithm


    【解决方案1】:

    您提到的第一个结构是(稀疏)图的标准表示。请注意,您还需要一个权重字段。我会把它作为图形的永久表示,只要它至少是稀疏的。

    是的,对于 Kruskal,您需要一个更像后者的结构,因为您需要一个明确的源顶点。我会为 Kruskal 定义一个没有链表的不同结构:

    int startPointIndex;
    int endPointIndex;
    int weight;
    

    您将分配这些结构的数组,用图中的边填充它们,按权重排序,然后通过端点的不相交集合并集扫描它们。

    【讨论】:

      【解决方案2】:

      为了实现 Kruskal 算法,用什么方式表示图形并不重要,因为您永远不会对属于某个顶点的边进行排序。相反,您将所有边放入一个数组中,然后按升序对该数组进行排序。

      你的图的表示并不重要,只要你可以遍历它,并将所有边收集到一个数组中(首先,你遍历图以计算边数,然后分配一个足够容量的数组,最后您再次遍历图形,将指向边缘的指针放入动态分配的数组中)。

      一旦指向边缘的指针位于数组中,就对数组进行排序(例如,使用qsort)并运行 Kruskal 算法。您需要实现Disjoint Sets 才能有效地合并森林;只要你实现链表没有问题,实现不相交集绝对不会给你带来麻烦。

      【讨论】:

      • 你的意思是数组包含指向边缘的指针?根据我的理解,我认为您提到的edge 是我在问题中定义的struct。在没有成员startPointIndex 的struct 中,通过使用指针,如何找到edge 的起点索引?遍历整个图表?不是很费时间吗?
      猜你喜欢
      • 2014-05-04
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2017-07-24
      • 2020-04-14
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多