基于连接矩阵的无向图最短路径Dijkstra算法

来源:互联网 发布:淘宝提示自助开通 编辑:程序博客网 时间:2024/05/18 14:28
#include <stdio.h>void Dijkstra(){   enum {maxdist = 999,};  int n = 5;int map [5][5] = {maxdist,       1, maxdist, maxdist, maxdist,      1, maxdist, maxdist,       1,       1,maxdist, maxdist, maxdist, maxdist,       1,maxdist,       1, maxdist, maxdist,       1,maxdist,       1,        1,      1, maxdist,};int used [5] = {      1,0,0,0,0};int dist [5] = {maxdist,0,0,0,0};    for(int i = 0; i < n; i++)        dist[i] = map[0][i];int k = 0;    for(int i = 1; i < n; i++){           int tmin = maxdist;         for(int j = 0; j < n; j++) {            if( !used[j] && tmin > dist[j] ){                tmin = dist[j];                k = j;            }}used[k] = 1;        for(int j = 0; j < n; j++) {            if( dist[k] + map[k][j] < dist[j] )                dist[j] = dist[k] + map[k][j];     }    }// Printf Resultsfor (int i = 0; i < n; i ++){printf("dist[%d]=%d\n", i, dist[i]);}}int main(int argc, char * argv []){return Dijkstra();}



教科书

#include <stdio.h>#include <string.h>#define Infinit                 (999)#define MAX_VERTEX_NUM(5)typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];struct MGraph{int vexnum;AdjMatrix arcs;};void Dijkstra(MGraph G){     int path[MAX_VERTEX_NUM][MAX_VERTEX_NUM];memset(path, 0, sizeof(path));int dist [MAX_VERTEX_NUM];memset(dist, 0, sizeof(dist));int used [MAX_VERTEX_NUM];memset(used, 0, sizeof(used));int v = 0, w = 0;// Initializefor (v = 0; v < G.vexnum; ++v){used[v] = false;dist[v] = G.arcs[0][v];// Clear pathfor (w = 0; w < G.vexnum; ++w) path[v][w] = false;// Only add self and the directly-connected vertex.if (dist[v] < Infinit){path[v][0] = true; path[v][v] = true;}}dist [0] = 0; used[0] = true;for (int k = 1; k < G.vexnum; ++k){int mindist = Infinit;for (w = 0; w < G.vexnum; ++w){if (!used[w] && dist[w] < mindist){v = w; mindist = dist[w];}}used[v] = true;for (w = 0; w < G.vexnum; ++w){if (!used[w] && (mindist + G.arcs[v][w] < dist[w])){dist [w] = mindist + G.arcs[v][w];// Append [v] vertex.memcpy(path[w], path[v], sizeof(path[v])); path [w][w] = true;}}}// Print Resultsfor (int k = 0; k < G.vexnum; ++k){printf("Distance[%d] = %d, Path: ", k, dist[k]);for (v = 0; v < G.vexnum; ++v){printf("%d, ", path[k][v]);}printf("\n");}}int main(int argc, char * argv []){MGraph G = {5, {Infinit,       2,       1,       1,       4,       2, Infinit, Infinit, Infinit, Infinit,       1, Infinit, Infinit, Infinit, Infinit,       1, Infinit, Infinit, Infinit, Infinit,       4, Infinit, Infinit, Infinit, Infinit, }};return Dijkstra(G);}


原创粉丝点击