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

一:最短路径问题(一)定义在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那条路径1.这条路径就是两点之间的最短路径2.第一个顶点为源点3.最后一个顶点终点(二)分类单源最短路径--->有权,无权--->有向,无向从某固定源点触发,求其到所有其他顶点的最短路径多源最短路径求任意两顶点间的最短路径可以通过对每个顶点使用一次单源(不是最好)二:无权图的单源最短路径(有向)不考虑...
摘要由CSDN通过智能技术生成

一:最短路径问题

(一)定义

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

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值