图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现

#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 )代码实现》

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/Whysf/article/details/51512161
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞