#include <stdio.h>
#define MAX_VERTEX_NUM 20 //最大顶点个数
typedef int VRTYPE, InfoType;
typedef enum {DG, DN, UDG, UDN} GraphKind; //{有向图、有向网、无向图、无向网}
typedef struct ArcCell
{
VRTYPE adj; //无权图为0或1; 带权图为权值
InfoType *info;
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
AdjMatrix arcs; //邻接矩阵,这里以数组下标唯一标识每个顶点
int vexnum, arcnum;
GraphKind kind;
}MGraph;
void create_G(MGraph *G)
{
int i, j, v;
printf("输入顶点数:\n");
scanf("%d", &G->vexnum);
printf("输入弧数:\n");
scanf("%d", &G->arcnum);
for (int m = 0; m < G->vexnum; m++)
for (int n = 0; n < G->vexnum; n++)
G->arcs[m][n].adj = -1; //不联通的弧设置其弧长为-1
printf("请按照起点号、终点号、弧长输入每条弧的信息:\n");
for (int k = 0; k < G->arcnum; k++)
{
scanf("%d%d%d", &i, &j, &v); //有弧连接的顶点对以及弧的权重,弧从i指向j(默认有向图)
G->arcs[i][j].adj = v;
}
}
void show_G(MGraph G) //展示创建的邻接矩阵
{
printf("\n创建的邻接矩阵:\n");
for (int m = 0; m < G.vexnum; m++)
{
for (int n = 0; n < G.vexnum; n++)
printf("%3d ", G.arcs[m][n].adj);
printf("\n");
}
printf("\n");
}
void ShortestPath_DIJ(MGraph G, int v0) //最短路算法
{
int D[MAX_VERTEX_NUM];
bool S[MAX_VERTEX_NUM] = { false };
for (int i = 0; i < G.vexnum; i++)
D[i] = G.arcs[v0][i].adj;
D[v0] = 0;
S[v0] = true;
for (int i = 0; i < G.vexnum; i++)
{
int j = 0, min = 0;
for (int m = 0; m < G.vexnum; m++) //找出当前必定是最短路的点
{
if (min == 0 && D[m] != -1 && !S[m])
{
min = D[m];
j = m;
}
else if (D[m] < min && D[m] != -1 && !S[m])
{
j = m;
}
}
S[j] = true;
for (int k = 0; k < G.vexnum; k++) //更新
if (!S[k])
if (G.arcs[j][k].adj != -1)
{
if (D[k] == -1)
D[k] = D[j] + G.arcs[j][k].adj;
else if (D[j] + G.arcs[j][k].adj < D[k])
D[k] = D[j] + G.arcs[j][k].adj;
}
}
printf("\n编号为%d顶点到其它顶点的最短路:\n", v0);
for (int i = 0; i < G.vexnum; i++)
printf("%d ", D[i]);
}
void main()
{
MGraph G;
create_G(&G);
show_G(G);
ShortestPath_DIJ(G, 0);
}
图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现
最新推荐文章于 2024-06-05 18:05:40 发布