(一)定义

在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那条路径

1.这条路径就是两点之间的最短路径
2.第一个顶点为源点
3.最后一个顶点终点

(二)分类

单源最短路径--->有权,无权--->有向,无向

从某固定源点触发,求其到所有其他顶点的最短路径

多源最短路径

求任意两顶点间的最短路径
可以通过对每个顶点使用一次单源(不是最好)

二:无权图的单源最短路径(有向)

不考虑无向,无向我们使用BFS,进行层次遍历时,就可以获取

(一)定义

按照递增(非递减)的顺序找出各个顶点的最短路径

数据结构(五)图---最短路径(迪杰斯特拉算法)

找出视图源点v3到每个顶点的最短路径

数据结构(五)图---最短路径(迪杰斯特拉算法)

(二)思考

从上图路径表我们可以看出,其路径是按照BFS(有所不同),使用队列进行递增访问各个顶点,从而遍历了所有顶点。
注意:这里我们不使用栈来实现,因为栈用到回溯法,而且使用栈不能很好找到最短路径

(三)代码实现

创建邻接矩阵时看这个图                进行结果对比用这个

数据结构(五)图---最短路径(迪杰斯特拉算法)数据结构(五)图---最短路径(迪杰斯特拉算法)

void unWeight(MGraph G, int s)
{
    int dist[MAXVEX];    //记录达到下标对应顶点的最小距离
    int path[MAXVEX];    //记录每个下标对应顶点的前一个经过的顶点
    int i, v, w;
    //生成队列一会使用
    LinkQueue Q;
    InitQueue(&Q);

    for (i = 0; i < MAXVEX; i++)
        dist[i] = -1;    //全部初始化为-1,表示该顶点未被访问过,没有找到最短路径到这个顶点
    //将源点入队
    EnQueue(&Q, s);
    dist[s] = 0;
    path[s] = s;    //将这里设置为他自己是自己的上一步,因为后面根本不会去设置他了

    while (!EmptyQueue(Q))
    {
        DeQueue(&Q, &v);
        for (w = 0; w < G.numVertexes; w++)
        {
            if (G.arc[v][w] == 1)    //找到邻接点w
            {
                if (dist[w] == -1)
                {
                    dist[w] = dist[v] + 1;
                    path[w] = v;
                    EnQueue(&Q, w);
                }
            }
        }
    }

    for (i = 0; dist[i] != -1; i++)  //对各个顶点的最短路径长度进行打印,以及他的上一步路径也打印
    {
        printf("%d %c-%c\n", dist[i], G.vers[path[i]], G.vers[i]);
    }
}

数据结构(五)图---最短路径(迪杰斯特拉算法)

(四)全部代码

数据结构(五)图---最短路径(迪杰斯特拉算法)
#pragma once
#ifndef _QUEUE_H
#define _QUEUE_H

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 100

typedef int ElemType;
typedef int Status;

typedef struct _qNode
{
    ElemType data;
    struct _qNode* next;
}QNode,*QNodePtr;

typedef struct
{
    QNodePtr front,rear;    //队头队尾指针
}LinkQueue;

Status InitQueue(LinkQueue* Q);
Status EnQueue(LinkQueue* Q, ElemType e);
Status DeQueue(LinkQueue* Q, ElemType* e);
Status EmptyQueue(LinkQueue Q);
Status getHead(LinkQueue Q,ElemType* e);

#endif
queue.h

相关文章:

  • 2021-09-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-14
  • 2021-05-23
  • 2021-08-17
  • 2022-12-23
猜你喜欢
  • 2021-08-09
  • 2022-12-23
  • 2021-12-28
  • 2021-09-04
  • 2022-12-23
相关资源
相似解决方案