码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-04-19 22:35:08      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:dijkstra   oid   struct   tty   计算   def   收入   []   mem   

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

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

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   oid   struct   tty   计算   def   收入   []   mem   

原文地址:https://www.cnblogs.com/yangzixiong/p/10739212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!