Dijkstra 算法 无向网

Dijkstra 算法 无向网

结构定义(C++)

typedef struct {
    int adj;//相邻接建筑之间的路程
}ArcCell;//定义边的类型
typedef struct {
    int number;//建筑编号
    string sight;//建筑名称
}VertexType;//定义顶点类型
typedef struct{
    VertexType vex[NUM];//图中的顶点,就是建筑
    ArcCell arcs[NUM][NUM];//图中的边,就是建筑之间的距离
    int vexnum,arcnum;//顶点数、边数
}MGraph;
const int INFINITY = 9999999;
typedef int Status ;
typedef int SElemType ;

代码(C++)

void ShortestPath_Dijkstra(MGraph G,int v0,int P[],int D[]){//G为已经创建好的无向网,v0代表开始的点,P[i]代表i这个点的前驱节点用于回溯来找顺序(如果P[i]=-1说明该点前没有点了,就是起始点(在本无向网中,其他的无向网中有可能是该点无法通过起始点到达。),D[i]代表从起始点到i点的最短距离。
    bool S[10]; //判断是否已存入该点到S集合中,就是固定了的点,之后它的值不会再变化了
    for (int i = 0; i < G.vexnum; ++i) {
        S[i]= false; D[i]=G.arcs[v0][i].adj;P[i]= -1;
        if (D[i]<INFINITY) P[i]=v0;//如果v0到i点有通路的话,把它的前者点设为v0
    }//初始化操作,先让所有点都不在S中,找出所有与起始点v0有通路的点,先将所有点的前驱节点标记为-1,然后如果它与v0有通路的话就将其前驱节点标记为v0
    D[v0]=0;//起始点自己到自己的距离为0
    S[v0]=true;//将起始点放到S集合之中
    int v;
    for (int k = 1; k < G.vexnum; ++k) {//最外层循环代表循环的次数,还有n-1个点需要我们去将它放到S之中。
        int minDist=INFINITY;//初始化最小值
        for (int i = 0; i < G.vexnum; ++i)
            if(!S[i]&&D[i]<minDist){v=i; minDist=D[i];}//循环的结果是得到不在S集合中最小的D,然后就将该节点作为最短路径去生成其他的点的路径
        S[v]= true;//把这个点放入S中
        for (int j = 0; j <G.vexnum ; ++j)
            if (!S[j]&&(minDist+G.arcs[v][j].adj<D[j])){D[j]=minDist+G.arcs[v][j].adj;P[j]=v;}//更新S外所有点的最短路径与前驱节点
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值