代码
#include <stdio.h>
#define MaxSize 20
#define INF 32767
#define MAXV 20
typedef char InfoType;
typedef struct
{
int no;
InfoType info;
} VertexType;
typedef struct
{
int edges[MAXV][MAXV];
int n, e;
VertexType vexs[MAXV];
} MGraph;
void Ppath(int path[], int i, int v)
{
int k;
k = path[i];
if (k == v)
return;
Ppath(path, k, v);
printf("%d,", k);
}
void Dispath(int dist[], int path[], int s[], int n, int v)
{
int i;
for (i = 0; i < n; i++)
if (s[i] == 1) {
printf(" 从%d到%d的最短路径长度为:%d\t路径为:", v, i, dist[i]);
printf("%d,", v);
Ppath(path, i, v);
printf("%d\n", i);
} else
printf("从%d到%d不存在路径\n", v, i);
}
void Dijkstra(MGraph g, int v)
{
int dist[MAXV], path[MAXV];
int s[MAXV];
int mindis, i, j, u = 0;
for (i = 0; i < g.n; i++) {
dist[i] = g.edges[v][i];
s[i] = 0;
if (g.edges[v][i] < INF)
path[i] = v;
else
path[i] = -1;
}
s[v] = 1;
path[v] = v;
for (i = 0; i < g.n; i++)
{
mindis = INF;
for (j = 0; j < g.n; j++)
if (s[j] == 0 && dist[j] < mindis) {
u = j;
mindis = dist[j];
}
s[u] = 1;
for (j = 0; j < g.n; j++)
if (s[j] == 0)
if (g.edges[u][j] < INF && dist[u] + g.edges[u][j] < dist[j]) {
dist[j] = dist[u] + g.edges[u][j];
path[j] = u;
}
}
Dispath(dist, path, s, g.n, v);
}
int main()
{
int i, j;
MGraph g;
g.n = 6;
g.e = 12;
int a[MAXV][MAXV] = {
{0, 5, INF, 6, 2, INF},
{INF, 0, 2, 1, INF, 10},
{INF, INF, 0, 4, INF, 2},
{INF, INF, INF, 0, INF, 4},
{INF, 1, INF, 3, 0, 9},
{INF, INF, INF, INF, INF, 0}
};
for (i = 0; i < g.n; i++)
for (j = 0; j < g.n; j++)
g.edges[i][j] = a[i][j];
printf("最短路径:\n");
Dijkstra(g, 0);
printf("\n");
}