最短路径——Dijkstra算法

最短路径:

        从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径。

算法思路:

        Dijkstra算法是一种用于求解带有非负加权边的图的单源最短路径的经典算法,它可以在所有边权非负的图中求解最短路径。

        Dijkstra算法的基本思路是从起点开始,不断 贪心 地选择当前能够到达的节点中距离最小的节点,并将其加入已访问的集合中,然后更新所有未访问的相邻节点的距离。重复以上步骤,直到终点被加入已访问集合中,或者所有可到达的节点已经被加入已访问集合中。

代码实现:

//边结点
typedef struct ArcNode{
    int adjvex; //所连接顶点的名称
    int cost; //该边的权值
    struct ArcNode* next; 
}ArcNode;

//点结点
typedef struct VNode{
    int data; //顶点存储的数据
    struct ArcNode* firstarc;
}VNode;

//邻接表
typedef struct {
    VNode adjlist[MaxSize]; //顶点列表
    int n , e ; //结点数和边数
}AGraph;

int path[MaxSize],dist[MaxSize],s[MaxSize];  //dist表示路径长度,s表示是否访问    

void DshortestPath(AGraph g , int v){
    for (int i = 0; i< g -> n; i++){
        path[i] = -1;
        dist[i] = INF;  //INF是一个足够大的数
        s[i] = 0;
    }
    dist[v] = 0;
    s[v] = 1;
    int u = v;

    for (int i = 0; i < g->n-1; i++)    //将n-1个结点加入集合s
    {
        ArcNode* p = g -> adjlist[u].firstarc;
        while (p != NULL)
        {
            int k = p -> adjvext;
            if (s[k]!= 1 && dist[k] > dist[u] + p -> cost)
            {
                dist[k] = dist[u] + p -> cost;
            }
            p = p -> next;
        }

        int minDist = INF;
        for (int j = 0;j < g->n; j++)
        {
            if (s[i] != 1 && minDist > dist[j])
            {
                minDist = dist[j];
                u = j;
            }
        }
        s[u] = 1;   //将选出的结点u加入到集合s

    }

}

你可能感兴趣的:(数据结构(ing),算法)