回 帖 发 新 帖 刷新版面

主题:带权有向图建立邻接表结构的最短路径求法???

用迪克斯特拉算法怎么实现带权有向图建立邻接表结构的最短路径求法???

回复列表 (共5个回复)

沙发

给个思路啊,我想了很久,谢谢

板凳

你如果会用邻接表简历图,那就简单了,只要实现算法就行了。

邻接表建立图的方法很简单,只需要把存在的边保存在以顶点为序号的链表中。

使用Dijkstra算法,只需要从起点开始,用贪心的形式一步步寻找最近的路径,逐步更新就可以了。Dijkstra算法我想不用重复了吧?

3 楼

刚学数据结构,着实不会,以邻接矩阵(Adjancency Matrix)存储的图,用Dijkstra算法求最短路径相对容易(边之间关系明显,至少我这么认为),用邻接表(Adjancency List)建立图似乎就没那么的简单,还请大虾写个算法给小弟参考参考,不尽感激。我是这样定义数据结构的:
//data struct
struct EdgeNode
{
   int endvex;            //边的另一顶点的序号
   int weight;           //边的权
   EdgeNode *nextedge;   //指向下一条边的指针

};

typedef struct
{
VertexType data;        //顶点信息
EdgeNode *edgelist;    //边表头指针

}VexNode;              //顶点表中的结点

typedef struct
{
  int n;//图的顶点个数
  VexNode Vexs[MAXNUM]; //顶点表
}GraphList;

4 楼

Adjacency List和Adjacency Matrix的区别就在于如何保存边的信息的。从邻接矩阵里面可以直接索引出一条边的信息,如d[2][3]就是顶点2和3之间的长度,权值就直接保存在矩阵里面。对于邻接表而言,权值也可以保存在链表节点里面(每个节点相当于一条边),比如这样的一个数据结构:

struct Graph
{
    int numVertex;
    int numEdge;
    EdgeHead *vertex;
    int *mark;
};

struct EdgeHead
{
    int numEdge;
    EdgeNode *Edges;
};

struct EdgeNode
{
     int vertex;
     unsigned int weight;
     struct EdgeNode *next;
};

5 楼

实现起来就没那么简单.........

我来回复

您尚未登录,请登录后再回复。点此登录或注册