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

来源:互联网 发布:淘宝网上有卖烟的吗 编辑:程序博客网 时间:2024/05/16 12:40
#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);}

Test

0 0
原创粉丝点击