Dijsktra算法代码:
1、首先是建图函数
int Locate(MGraph G, VertexType c)
{
for (int i = 1; i <= G.vexnum; i++)
{
if (c == G.vexs[i])
return i;
}
return -1;
}
Status CreateDN(MGraph& G)
{
for (int i = 0; i < MAX_VERTEX_NUM; i++)
{
for (int j = 0; j < MAX_VERTEX_NUM; j++)
{
if (i == j)G.arcs[i][j] = 0;
else G.arcs[i][j] = INFINITY;
}
}
char c;
printf("请输入图的结点个数:");
scanf("%d", &G.vexnum);
c = getchar();
printf("请输入图的边的个数:");
scanf("%d", &G.arcnum);
c = getchar();
printf("请输入各个顶点:");
for (int i = 1; i <= G.vexnum; i++)
{
scanf("%c", &G.vexs[i]);
}
c = getchar();
VertexType char1, char2;
int weight;
printf("请输入各个边(eg.AB 12):\n");
for (int i = 1; i <= G.arcnum; i++)
{
scanf("%c%c", &char1, &char2);
c = getchar();
scanf("%d", &weight);
c = getchar();
int p = Locate(G, char1);
int q = Locate(G, char2);
if (p == -1 || q == -1)return false;
G.arcs[p][q] = G.arcs[q][p] = weight;
}
return true;
}
2、其次是打印邻接矩阵
void Print(MGraph G)
{
printf(" ");
for (int i = 1; i <= G.vexnum; i++)
{
printf("%c\t", G.vexs[i]);
}
puts("");
for (int i = 1; i <= G.vexnum; i++)
{
printf("%c ", G.vexs[i]);
for (int j = 1; j <= G.vexnum; j++)
{
if (G.arcs[i][j] != INFINITY)printf("%d\t", G.arcs[i][j]);
else printf("∞\t");
}
puts("");
}
}
3.最后是dijsktra算法函数
int ShortestPath_DIJ(MGraph& G, int v0)
{
int cnt[MAX_VERTEX_NUM] = { 0 };//记录路径长度
for (int i = 1; i <= G.vexnum; i++)
{
dis[i] = G.arcs[v0][i];
if (i == v0)path[i][cnt[i]++] = G.vexs[v0];
else if (G.arcs[v0][i] != INFINITY)
{
path[i][cnt[i]++] = G.vexs[v0];
path[i][cnt[i]++] = G.vexs[i];
}
vis[i] = 0;
}
vis[v0] = 1;
for (int i = 1; i < G.vexnum; i++)
{
int min = INFINITY;
int pos = -1;
for (int j = 1; j <= G.vexnum; j++)
{
if (vis[j] == 0 && dis[j] < min)
{
min = dis[j];
pos = j;
}
}
if (min == INFINITY || pos == -1)return false;
vis[pos] = 1;
for (int j = 1; j <= G.vexnum; j++)
{
if (vis[j] == 0 && dis[j] > dis[pos] + G.arcs[pos][j])
{
dis[j] = dis[pos] + G.arcs[pos][j];
strcpy(path[j], path[pos]);
cnt[j] = strlen(path[j]);
path[j][cnt[j]] = G.vexs[j];
}
}
}
return true;
}
总代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY 0x3f3f3f3f
#define MAX_VERTEX_NUM 50
typedef char VertexType;
typedef int Status;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;
}MGraph;
int dis[MAX_VERTEX_NUM] = { 0 };
int vis[MAX_VERTEX_NUM] = { 0 };
char path[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//记录路径
int Locate(MGraph G, VertexType c)
{
for (int i = 1; i <= G.vexnum; i++)
{
if (c == G.vexs[i])
return i;
}
return -1;
}
Status CreateDN(MGraph& G)
{
for (int i = 0; i < MAX_VERTEX_NUM; i++)
{
for (int j = 0; j < MAX_VERTEX_NUM; j++)
{
if (i == j)G.arcs[i][j] = 0;
else G.arcs[i][j] = INFINITY;
}
}
char c;
printf("请输入图的结点个数:");
scanf("%d", &G.vexnum);
c = getchar();
printf("请输入图的边的个数:");
scanf("%d", &G.arcnum);
c = getchar();
printf("请输入各个顶点:");
for (int i = 1; i <= G.vexnum; i++)
{
scanf("%c", &G.vexs[i]);
}
c = getchar();
VertexType char1, char2;
int weight;
printf("请输入各个边(eg.AB 12):\n");
for (int i = 1; i <= G.arcnum; i++)
{
scanf("%c%c", &char1, &char2);
c = getchar();
scanf("%d", &weight);
c = getchar();
int p = Locate(G, char1);
int q = Locate(G, char2);
if (p == -1 || q == -1)return false;
G.arcs[p][q] = G.arcs[q][p] = weight;
}
return true;
}
void Print(MGraph G)
{
printf(" ");
for (int i = 1; i <= G.vexnum; i++)
{
printf("%c\t", G.vexs[i]);
}
puts("");
for (int i = 1; i <= G.vexnum; i++)
{
printf("%c ", G.vexs[i]);
for (int j = 1; j <= G.vexnum; j++)
{
if (G.arcs[i][j] != INFINITY)printf("%d\t", G.arcs[i][j]);
else printf("∞\t");
}
puts("");
}
}
int ShortestPath_DIJ(MGraph& G, int v0)
{
int cnt[MAX_VERTEX_NUM] = { 0 };//记录路径长度
for (int i = 1; i <= G.vexnum; i++)
{
dis[i] = G.arcs[v0][i];
if (i == v0)path[i][cnt[i]++] = G.vexs[v0];
else if (G.arcs[v0][i] != INFINITY)
{
path[i][cnt[i]++] = G.vexs[v0];
path[i][cnt[i]++] = G.vexs[i];
}
vis[i] = 0;
}
vis[v0] = 1;
for (int i = 1; i < G.vexnum; i++)
{
int min = INFINITY;
int pos = -1;
for (int j = 1; j <= G.vexnum; j++)
{
if (vis[j] == 0 && dis[j] < min)
{
min = dis[j];
pos = j;
}
}
if (min == INFINITY || pos == -1)return false;
vis[pos] = 1;
for (int j = 1; j <= G.vexnum; j++)
{
if (vis[j] == 0 && dis[j] > dis[pos] + G.arcs[pos][j])
{
dis[j] = dis[pos] + G.arcs[pos][j];
strcpy(path[j], path[pos]);
cnt[j] = strlen(path[j]);
path[j][cnt[j]] = G.vexs[j];
}
}
}
return true;
}
int main()
{
MGraph G;
char start;
if (CreateDN(G))
{
printf("图创建成功!它的邻接矩阵为:\n");
Print(G);
}
else printf("图创建失败QwQ\n");
printf("请输入图的起点:\n");
scanf("%c", &start);
int v0 = Locate(G, start);
if (ShortestPath_DIJ(G, v0))puts("Dijsktra算法完成!\n");
else printf("Dijsktra算法失败\n");
printf("各点到起点的最短路径的长度及其路径为:\n");
for (int i = 1; i <= G.vexnum; i++)
{
printf("%c : %d\t%s\n", G.vexs[i], dis[i], path[i]);
}
return 0;
}
样例:
9
16
ABCDEFGHI
AB 1
AC 5
BC 3
BD 7
BE 5
CE 1
CF 7
DE 2
EF 3
DG 3
EG 6
EH 9
FH 5
GH 2
GI 7
HI 4
A
运行结果: