问题

假设图G采用邻接表存储,设计一个算法,求不带权无向连通图G中从顶点u->v的最短路径(路径上经过的顶点数最少。采用广度优先遍历来实现。

基本思路

我们首先来看一下BFS的过程:

图片摘自慕课网李春葆老师讲的数据结构。从图中我们可以看到BFS的过程就是给定一个起点u,从起点u到某一个顶点(假设v)的最短路径构成分层。
下面我先给出一个代码,然后再给出一个例题并进行分析。

代码

typedef struct ANode {int adjvex;                //该边的终点编号struct ANode *nextarc; //指向下一条边的指针int name[10];            //该边的权值等信息
}ArcNode;typedef struct Vnode {char data;               //顶点信息ArcNode *firstarc;        //指向第一条边
}VNode;typedef struct {VNode adjlist[MAXV]; //邻接表int n, e;              //途中顶点数n和边数e
}ALGraph;typedef struct {int data;      //顶点编号int parent;       //前一个顶点的位置
}QUERE;void ShortPath(ALGraph *G, int u, int v) {//输出从顶点u到顶点v的最短逆路径ArcNode *p; int w, i;QUERE qu[MAXV];                         //定义非循环队列int front = -1, rear = -1;               //队列的头、尾指针int visited[MAXV];for (i = 0; i < G->n; i++)visited[i] = 0;rear++;qu[rear].data = u;qu[rear].parent = -1;visited[u] = 1;while (front != rear) {                   //队不空循环front++;w = qu[front].data;if (w == v) {i = front;while (qu[i].parent != -1) {cout << qu[i].data << " ";i = qu[i].parent;}cout << qu[i].data << " " << endl;break;}p = G->adjlist[w].firstarc;             //找w的第一个邻接点while (p != NULL) {if (visited[p->adjvex] == 0) {visited[p->adjvex] == 1;rear++;                            //将w未访问过的邻接点进队qu[rear].data = p->adjvex;qu[rear].parent = front;}p = p->nextarc;                       //找w的下一个邻接点}}
}

例题


这里假设起点u=1,终点v=4。要求,求出起点u->v的最短路径。

核心思想

在到达某一点之后遍历这个点所能到达的所有点,并记录能够到达这个点的上一个点。

例题分析

我们可以先画出这个图的邻接表结构:

根据代码我们可以列出三个表来表示运行的过程,各个变量的数值变化:

最左边的这个表表示,图的每个节点是否被访问,visited[i]=1,表示 i 这个节点已经被访问过。从上到下表示了程序运行过程中各个节点被访问的先后顺序。中间的这个表,表示front 和 rear 这两个变量的值随着程序运行而变化的结果。最右边的表表示了,data和parent的这两个变量值的变化。
最终程序输出4-2-1。正好是正确答案的倒序。

基于广度优先遍历算法求采用邻接表存储的无向连通图G中从顶点u到v的最短路径相关推荐

  1. 将图的广度优先遍历在邻接矩阵和邻接表存储结构上分别实现_图解:什么是“图”?

    从今天开始,我们开始介绍图的相关算法 什么是"图" 1.背景 作为图的开始,我们先来看一个经典的问题,它被认为是图论的起源. 这个问题是基于一个现实生活中的事例:河中心有两个小岛. ...

  2. 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。

    采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径.设计算法,将一个无向图的邻接矩阵转换为邻接表. 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径. 设计算法,将一个无向图的邻 ...

  3. 4.6设计一个算法判断图G中从顶点u到v是否存在简单路径

    1. 题目描述 假设图G采用邻接表存储,设计一个算法判断图G中从顶点u到v是否存在简单路径 所谓简单路径是指路径上的顶点不重复.可采用深度优先遍历的方法 #include <bits/stdc+ ...

  4. 采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。

    以邻接表存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i!=j). 问题描述:试基于图的深度优先搜索策略编写一程序,判别以邻接表存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i!=j). 输入 ...

  5. 图采用邻接表存储,设计一个算法,判断顶点i和顶点j(i!=j)之间是否有路径

    算法思想:只要以i为起点,进行遍历,只要遍历过程中遇到了j,就证明有路径. 算法代码 int DFSTravel(AGraph *G,int i,int j) {int k;for(k=0;k< ...

  6. 算法6.6 采用邻接表表示图的深度优先搜索遍历

    算法6.6 采用邻接表表示图的深度优先搜索遍历 代码实现 #pragma once #include <iostream>using namespace std;//图的邻接表存储表示 # ...

  7. 图的邻接表存储与深度优先遍历代码实现

    Graph.h Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化) #include <std ...

  8. 图的邻接表存储实现(第七章 P163)

    图的邻接表存储结构: 下图分别是有向图和无向网的的邻接表存储结构.要注意的是,为了提高效率,程序中的基本操作函数 CreateGraph()产生链表时总是在表头插入结点. 所以,对于给定的图,即使它的 ...

  9. 数据结构实践——操作用邻接表存储的图

    本文是针对[数据结构基础系列(7):图]的实践. [项目 - 操作用邻接表存储的图] 假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大 ...

最新文章

  1. 【舒工强烈推荐】命令添加Git远程仓库
  2. python安装pip-Python2.7.5安装pip9.0.1
  3. 理解Promise (4)
  4. List集合、常用数据结构基本了解
  5. mac 打开html c python,在Mac系统使用Visual Studio Code运行Python的方法
  6. python二维数组排序_Python实现二维数组按照某行或列排序的方法【numpy lexsort】...
  7. zabbix mysql密码_重置Zabbix数据库Admin的密码
  8. 关于 IMPP/XMPP/SIMPLE 这几种即时通讯协议和NAT traversal
  9. PHP读取表格都是精度,php 小数精度问题
  10. 我要做 Android 之面笔试
  11. 自己编写的中文字符串的截取函数
  12. 博微软件网络服务器安装,负载均衡服务器nginx详细安装教程及网络部署
  13. 服务器搬迁方案_机房搬迁的一般步骤及实施方案
  14. OCR文字识别SDK
  15. “三权分立”模型之角色模型
  16. 称重传感器(体脂体重模块)应用及特点
  17. python爬虫之汽车之家论坛帖子内容爬取
  18. fastjson.android首字母大写转化问题
  19. 美通企业日报 | 嘉士伯打造全球首个纸质啤酒瓶;网球名将费德勒与辛芷蕾融情邂逅...
  20. Gitlab----Pipline流水线语法only、except、rules、workflow

热门文章

  1. Linux中彻底删除文件
  2. 荣耀6plus android版本号,荣耀6PLUS升级安卓6.0(emui4.0)感受
  3. C语言-单词长度统计
  4. 怎么打包python环境_python环境搭建和打包
  5. [ 个人住房担保委托贷款(住房公积金贷款)]
  6. MVC 使用ViewBag 加载数据 与laypage 结合
  7. 面试题大全1-javaSE部分-JavaEE框架中间件
  8. 域名检测工具-免费老域名扫描软件下载
  9. python输入直角三角形的两直角边,求周长、面积和锐角度数
  10. 计算机无法关闭密码保护共享,xp系统怎么关闭密码保护共享