최단 경로 알고리즘 - 데이 크 스트라 (다 익스트라)

알고리즘


  • 설정 G = (V, E)의 중량을 갖는 방향 그래프 될
  • 두 그룹으로 그래프의 정점의 집합 V
  • 모든 정점은 S에 추가 될 때까지 S 최단 경로 정점의 집합으로 표시되는 첫 번째 그룹은 (측정 된 초기에만 소스 S는 각각 최단 경로 후, 상기 집합 S에 추가 될 얻어진 알고리즘은) 끝났다
  • (U로 표시되는) 두 번째 그룹은 나머지 미결정 최단 경로의 정점의 집합이며
  • 최단 경로 길이의 오름차순으로 순차적으로 S 번째 그룹의 꼭대기에 추가 될
  • 첨가하는 동안, 짧은 광로 길이의 정점 소스 S의 V에서 전체가 U 유지하기 위해 소스 꼭지점의 V에서 어떤 최단 경로의 길이보다 크지
  • 또한, 이것의 정점으로부터의 거리 S에 대응하는 각 정점은 그 소스 정점 (V)에서 최단 경로의 길이
  • U 자의 꼭대기로부터의 거리가,이 소스 정점 포인트 V는 S 중간 현재의 정점의 최단 길이 인 버텍스 포함 내지

 

C 언어 의사는 익스트라 설명


void ShortestPath_DIJ( MGraph G, int v0, PathMatrix &P, ShortPathTable &D){
    // 用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]及其带权长度D[v]。
    // 若P[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。
    // final[v]为TRUE当且仅当v∈S,即已经求得从v0到v的最短路径。
    for (v = 0; v < G.vexnum; ++ v){
        final[v] = FALSE; D[v] = G.arcs[v0][v];
        for (w = 0; w < G.vexnum; ++ ww) P[v][w] = FALSE;// 设空路径
        if (D[v] < INFINITY) {P[v][v0] = TRUE; P[v][v] = TRUE;}
    }// for
    D[v0] = 0; final[v0] = TRUE;// 初始化,v0顶点属于S集
    // 开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集
    for (i = 1; i < G.vexnum; ++ i) {// 其余G.vexnum - 1个顶点
        min = INFINITY;// 当前所知离v0顶点的最近距离
        for (w = 0; w < G.vexnum; ++ w)
            if(!final[w])// w顶点在V-S中
                if(D[w] < min) {v = w; min = D[w];}// w顶点离v0顶点更近
        final[v] = TRUE;// 离v0顶点最近的v加入S集
        for(w = 0; w < G.vexnum; ++ w)// 更新当前最短路径及距离
            if(!final[w] && (min + G.arcs[v][w] < D[w])){// 修改D[w]和P[w],x∈V-S
                D[w] = min + G.arcs[v][w];
                P[w] = P[v]; P[w][w] = TRUE;// P[w] = P[v] + P[w]
            }// if
    }// for

}// ShortestPath_DIJ

 

C 언어 프로그래밍 알고리즘 바와


void Dijkstra(float cost[][n], int v){
    // 求源点v到其余顶点的最短路径及其长度,cost为有向网的带权邻接矩阵
    // 设max值为32767,代表一个很大的数
    v1 = v - 1;
    for(i = 0; i < n; i ++){
        dist[i] = cost[v1][i];// 初始化dist
        if(dist[i] < max) pre[i] = v; else pre[i] = 0;
    }
    pre[v1] = 0;
    for(i = 0; i < n; i ++) S[i] = 0;// 第一组开始为空集
    S[v1] = 1;// 源点v并入第一组
    for(i = 0; i < n; i ++){// 扩充第一组
        min = max;
        for(j = 0; j < n; j ++)
            if(!S[j] && (dist[j] < min)) {min = dist[j]; k = j;}
        S[k] = 1;// 将k+1加入第一组
        for(j = 0; j < n; j ++)
            if(!S[j] && (dist[j] > dist[k] + cost[k][j])){// 修正第二组各顶点的距离值
                disk[j] = disk[k] + cost[k][j]; pre[j] = k + 1;// k + 1是j + 1的前趋
            }// 所有顶点均已扩充到S中
        for(j = 0; j < n; j ++){// 打印结果
            printf("%f\n%d", dist[i], i + 1);
            p = pre[i];
            while(p != 0){// 继续找前趋顶点
                printf("<--%d", p);
                p = pre[p - 1];
            }
        }
    }// Dijkstra

}
게시 28 개 원래 기사 · 원의 찬양 3 · 조회수 5284

추천

출처blog.csdn.net/u012632105/article/details/105093196