带权单源最短路发[稠密图](Dijkstra)

Posted yangzixiong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带权单源最短路发[稠密图](Dijkstra)相关的知识,希望对你有一定的参考价值。

对于稠密图,采用邻接矩阵较为合适

所以我们先构建一个邻接矩阵

typedef int Vertex;
typedef int WeightType;

//
typedef struct MyGraph
{
    int v, e;
    WeightType G[MaxVertexNum][MaxVertexNum];    
}MyGraph;

//顶点信息, 可以不定义
typedef struct NodeType
{
    Vertex id;
//    Data data;            当节点有需要添加的信息时使用 

}NodeType;

 

接下来我们使用Dijkstrs算法

void Dijkstra(int dist[], Vertex path[], MyGraph& g, Vertex id)
{
        //是否被收入的集合
    int collection[g.v]; 
    memset(collection, 0, sizeof(collection));
    dist[id] = 0;
    int mmin = INF;
    while(1)
    {
        int v = -1;
        mmin = INF;
        //稠密图用循环选出还没加入的节点的暂时的最短路的最小值 
        for(int i = 0; i < g.v; i++)
            if(mmin > dist[i] && collection[i] != 0)
            {
                mmin = dist[i];
                v = i;    
            }
        //如果都加入了, 那么退出 
        if(v == -1)
            break;
        //将选出的节点收入 
        collection[v] = 1;
        //修改因为收入节点而受影响的节点的最短路 
        for(int j = 0; j < g.v; j++)
        {
            //如果使得原来的节点变得更短, 则更新最短距离并且更新最短路 
            //这里collection[j]要没有被收入才计算,
            //因为如果j被收入,那么dist[v]应当更小,那么v应当在j之前被收入, 相互矛盾 
            if(collection[j] == 0 && dist[j] > dist[v] + g.G[v][j]) 
            {
                dist[j] = dist[v] + g.G[v][j];
                path[j] = v;
            }
        }
        
    }    
} 

新手,欢迎大家找错误,提建议

以上是关于带权单源最短路发[稠密图](Dijkstra)的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra:正边权单源最短路算法

Bellman-ford 单源最短路径算法

[C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

有向网络(带权的有向图)的最短路径Dijkstra算法

最短路径问题之Dijkstra算法(C语言)

Floyd算法:多源汇最短路