迪杰斯特拉算法

最近一直带两个考研学生的《数据结构》,正好讲到图这一章,顺便实现了一下迪杰斯特拉算法。

  1 #include"stdafx.h"
  2 #include <iostream>
  3 
  4 using namespace std;
  5 const int MAXSIZE = 10;
  6 const int INF = 99999;//当作最大值
  7 typedef struct VertexNode{
  8     int Index;//点的编号默认为从1开始
  9     char info;
 10 };
 11 
 12 typedef struct MGraph{
 13     int edges[MAXSIZE][MAXSIZE];
 14     VertexNode nodes[MAXSIZE];
 15     int n, e;
 16 };
 17 //构建一个用邻接矩阵存储的图
 18 void CreateMGraph(MGraph& g,int n,int e);
 19 //迪杰斯特拉算法求图的最短路径
 20 void DijkStra(MGraph& g, int v, int dist[], int path[]);
 21 //输出该最短路径
 22 void PrintRoad(int path[],int v);
 23 
 24 void main(void)
 25 {
 26     MGraph g;
 27     int dist[MAXSIZE];
 28     int path[MAXSIZE];
 29     CreateMGraph(g, 7, 12);
 30     DijkStra(g, 1, dist, path);
 31     PrintRoad(path, 7);
 32 }
 33 
 34 void CreateMGraph(MGraph& g, int n,int e)
 35 {
 36     g.n = n;
 37     g.e = e;
 38     int vertex1, vertex2;
 39     int value;
 40     for (int i = 1; i <= n; ++i)
 41     {
 42         g.nodes[i].Index = i;
 43     }
 44 
 45     for (int i = 1; i <= g.n; ++i)
 46     for (int j = 1; j <= g.n; ++j)
 47     {
 48         g.edges[i][j] = INF;
 49     }
 50     
 51     for (int j = 1; j <= e; j++)
 52     {
 53         cout << "请输入边的两个点,中间以空格隔开
";
 54         cin >> vertex1 >> vertex2;
 55         cout << "请输入该边的权值
";
 56         cin >> value;
 57         g.edges[vertex1][vertex2] = value;
 58     }
 59 }
 60 
 61 void DijkStra(MGraph& g, int v,int dist[], int path[])
 62 {
 63     int i, j, min, u;
 64     int visited[MAXSIZE];
 65     for (i = 1; i <= g.n; ++i)
 66     {
 67         if (g.edges[v][i] < INF)
 68         {
 69             dist[i] = g.edges[v][i];
 70             path[i] = v;
 71         }
 72         else
 73         {
 74             dist[i] = -1;
 75             path[i] = -1;
 76         }
 77 
 78         visited[i] = 0;
 79     }
 80     visited[v] = 1;
 81     for (i = 1; i <= g.n; ++i)
 82     {
 83         min = INF;
 84         for (j = 1; j <= g.n;++j)
 85         if (visited[j] == 0 && dist[j] < min)
 86         {
 87             min = dist[j];
 88             u = j;
 89         }
 90         visited[u] = 1;
 91         for (j = 1; j <= g.n; ++j)
 92         {
 93             if (visited[j] == 0 && dist[j] > g.edges[u][j] + dist[u])
 94             {
 95                 dist[j] = g.edges[u][j] + dist[u];
 96                 path[j] = u;
 97             }
 98         }
 99     }
100 }
101 
102 void PrintRoad(int path[],int v)
103 {
104     int stack[MAXSIZE], top = -1;
105     while (path[v]!= -1)
106     {
107         stack[++top] = v;
108         v = path[v];
109     }
110     stack[++top] = v;
111     while (top != -1)
112     {
113         cout << stack[top--] << " ";
114     }
115     cout << endl;
116 }
原文地址:https://www.cnblogs.com/tgycoder/p/4956175.html