图的最短路径算法实验

实验内容

1.采用邻接矩阵表示法创建下图并输出它。

2. 用迪杰斯特拉算法求下图0为源点到其余各顶

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100

typedef struct {
    int vexs[MaxSize];
    int arcs[MaxSize][MaxSize];            
    int vexnum;                           
    int arcsnum;                      
}Graph;


void creatGraph(Graph *G) {
    scanf("%d %d", &G->vexnum, &G->arcsnum);
    for (int i = 0; i < G->vexnum; i++)
    {
        for (int j = 0; j < G->vexnum; j++) {
            G->arcs[i][j] =1000;   
        }
    }
    for (int k = 0; k < G->arcsnum; k++)
    {
        int a, b, c = 0;
        scanf("%d %d %d", &a, &b, &c);
        G->arcs[a-1][b-1] = c;
    }

}

void Dijkstra(Graph *G,int v0) {
    int* dist = (int*)malloc(sizeof(int) * G->vexnum);
    int* path= (int*)malloc(sizeof(int) * G->vexnum);
    int* flag= (int*)malloc(sizeof(int) * G->vexnum);
    for (int i = 0; i < G->vexnum; i++)    
    {
        flag[i] = 0;

    }

    for (int i = 0; i < G->vexnum; i++)
    {
        dist[i] = G->arcs[v0][i];
        if (G->arcs[v0][i]<1000) {
            path[i] = v0;

        }
        else
        {
            path[i] = -1;
        }
        dist[v0] = 0;
        path[v0] = -1;
        flag[v0] = 1;
        int min = 1000;
        int pos = 0;
        for (int i = 0; i < G->vexnum; i++)
        {
            for (int j=0; j < G->vexnum; j++) {
                if (dist[j]<min)
                {
                    min = dist[j];
                    pos = j;
                }
            }
            flag[pos] = 1;
            for (int i = 0; i < G->vexnum; i++)
            {
                if (flag[i] == 0 && dist[pos]+G->arcs[pos][i]<dist[i]) {
                    dist[i] = dist[pos] + G->arcs[pos][i];
                    path[i] = pos;
                }
            }
        }

    }




}

 

好了,我们下回见,peace

posted @ 2020-10-13 17:16  野评测  阅读(258)  评论(0)    收藏  举报