(一)定义
在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那条路径
1.这条路径就是两点之间的最短路径
2.第一个顶点为源点
3.最后一个顶点终点
(二)分类
单源最短路径--->有权,无权--->有向,无向
多源最短路径
二:无权图的单源最短路径(有向)
不考虑无向,无向我们使用BFS,进行层次遍历时,就可以获取
(一)定义


(二)思考
从上图路径表我们可以看出,其路径是按照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