一:最短路径问题
(一)定义
在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那条路径
1.这条路径就是两点之间的最短路径2.第一个顶点为源点3.最后一个顶点终点
(二)分类
单源最短路径--->有权,无权--->有向,无向
从某固定源点触发,求其到所有其他顶点的最短路径
多源最短路径
求任意两顶点间的最短路径
可以通过对每个顶点使用一次单源(不是最好)
二:无权图的单源最短路径(有向)
不考虑无向,无向我们使用BFS,进行层次遍历时,就可以获取
(一)定义
按照递增(非递减)的顺序找出各个顶点的最短路径
找出视图源点v3到每个顶点的最短路径
(二)思考
从上图路径表我们可以看出,其路径是按照BFS(有所不同),使用队列进行递增访问各个顶点,从而遍历了所有顶点。
注意:这里我们不使用栈来实现,因为栈用到回溯法,而且使用栈不能很好找到最短路径长
(三)代码实现
创建邻接矩阵时看这个图 进行结果对比用这个
void unWeight(MGraph G, ints)
{int dist[MAXVEX]; //记录达到下标对应顶点的最小距离
int path[MAXVEX]; //记录每个下标对应顶点的前一个经过的顶点
inti, 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#include
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100typedefintElemType;
typedefintStatus;
typedefstruct_qNode
{
ElemType data;struct _qNode*next;
}QNode,*QNodePtr;
typedefstruct{
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
#include "queue.h"Status InitQueue(LinkQueue*Q)
{if (!Q)returnERROR;
Q->front = Q->rear = (QNodePtr)malloc(sizeof(QNode));if (!Q->front)returnERROR;
Q->front->next =NULL;returnOK;
}
Status EnQueue(LinkQueue*Q, ElemType e)
{//尾插法
if (!Q)returnERROR;
QNodePtr q= (QNodePtr)malloc(sizeof(QNode));if (!q)returnERROR;
q->data =e;
q->next = (*Q).rear->next;
(*Q).rear->next =q;
Q->rear =q;returnOK;
}
Status DeQueue(LinkQueue* Q, ElemType*e)
{
QNodePtr q;if (!Q || !e || EmptyQueue(*Q))returnERROR;
q= Q->front->next;
Q->front->next = q->next;*e = q->data;if (Q->rear ==q)
Q->rear = Q->front;
free(q);returnOK;
}
Status EmptyQueue(LinkQueue Q)
{if (!Q.front->next)returnTRUE;returnFALSE;
}
Status getHead(LinkQueue Q,ElemType*e)
{
QNodePtr q;if(EmptyQueue(Q))returnERROR;
q= Q.front->next;*e = q->data;returnOK;
}