图形的遍历

article/2025/10/28 18:44:53

一个图形G=(V,E),存在某一顶点v,希望从v开始,通过此顶点相邻的顶点而去访问G中其他顶点直达全部的顶点遍历完毕。在遍历的过程中可能会重复经过某些顶点及边线,经由图形的遍历可以判断该图形是否连通,并找出连通单元和路径。
图形遍历有两种方法:

  • 深度优先搜索Deep-First-Search
  • 广度优先搜索Breadth-First-Search

一、深度优先搜索

从图形的某一顶点开始遍历,被访问过的顶点做上已访问的标记,接着从与此顶点相邻且未访问过的顶点中选择任意一个顶点,并做上已访问的记号,再以该顶点为新的起点进行深度优先搜索遍历。

我们以下图为例进行代码实现:
这里写图片描述

定义public static void DFS(int current)实现深度优先搜索,定义数组run[]来标记顶点的遍历情况,1表示已遍历,0表示未遍历。图使用邻接表进行存放,从选定顶点的链表的头结点进行判断,若该顶点未遍历,则递归调用该函数从该节点开始进行深度优先遍历,否则指针后移寻找该顶点未被遍历的顶点。

public static void DFS(int current)代码如下:

    public static void DFS(int current) {run[current]=1;                                        //改顶点设为已遍历System.out.print("["+current+"]");                     //打印顶点while(head[current].first!=null) {                     //从链表头结点开始if(run[head[current].first.data]==0)               //若该顶点未遍历就进行DFS递归调用DFS(head[current].first.data);head[current].first=head[current].first.next;      //否则指针后移}}

主要代码如下:(Node类和GraphLink类的定义见博客图表示法中的邻接表法
http://blog.csdn.net/zd454909951/article/details/78896793)

public class Test {//静态变量可全局使用public static int[] run=new int[9];                     //判断顶点是否已遍历,1代表遍历,0代表未遍历public static GraphLink[] head=new GraphLink[9];        //声明链接表数组public static void main(String[] args) {int data[][]= {{1,2},{2,1},{1,3},{3,1},{2,4},{4,2},{2,5},{5,2},{3,6},{6,3},{3,7},{7,3},{4,5},{5,4},{6,7},{7,6},{5,8},{8,5},{6,8},{8,6}};System.out.println("图形的邻接表的内容:");for(int i=1;i<9;i++) {run[i]=0;head[i]=new GraphLink();System.out.print("顶点"+i+"=>");for(int j=0;j<data.length;j++) {if(data[j][0]==i)head[i].insert(data[j][1]);}head[i].print();}System.out.println("深度优先遍历顶点:");DFS(1);    //从顶点1开始遍历System.out.println();}

程序运行结果如下:
这里写图片描述

递归函数DFS具体运行过程如下:
这里写图片描述

这里写图片描述

二、广度优先搜索

从图中的某一顶点开始遍历,然后访问所有与其相邻的顶点,最后访问所有与这些顶点相邻的顶点。
代码中需要用到队列,选择一个顶点入队,然后将其所有相邻的未被访问的顶点都入队,依次对队列中的顶点进行上述操作直到队列为空。

public static void BFS(int current)代码如下:

    /*广度优先搜索函数*/public static void BFS(int current) {Node tempNode;enqueue(current);                                         //将第一个顶点存入队列run[current]=1;                                           //将遍历过的顶点设为1System.out.print("["+current+"]");                        //打印该遍历过的顶点while(front!=rear) {                                      //判断队列是否为空current=dequeue();                                    //从队列中取出顶点tempNode=head[current].first;                         //记录目前顶点的链表的表头while(tempNode!=null) {                               //判断该顶点的链表是否为空,即遍历所有与该顶点相邻的顶点if(run[tempNode.data]==0) {                       //相邻的顶点未遍历enqueue(tempNode.data);                       //访问该顶点并存入队列run[tempNode.data]=1;                         //将该顶点标记为已遍历System.out.print("["+tempNode.data+"]");      //打印该顶点}tempNode=tempNode.next;                           //指针后移,继续遍历出队列顶点的链表}}}/*入队*/public static void enqueue(int value) {if(rear>=MAXSIZE)                                         //队列已满return;rear++;queue[rear]=value;}/*出队*/public static int dequeue() {if(front==rear)                                           //队列为空return -1;front++;return queue[front];}

主要代码如下:(Node类和GraphLink类的定义见博客图表示法中的邻接表法
http://blog.csdn.net/zd454909951/article/details/78896793)

public class Test {public static int[] run=new int[9];                          //用来记录各顶点是否遍历过public static GraphLink[] head=new GraphLink[9];public final static int MAXSIZE=10;                          //定义队列的最大容量static int[] queue=new int[MAXSIZE];                         //队列数组的声明static int front=-1,rear=-1;                                 //定义队列的头指针和尾指针public static void main(String[] args) {int data[][]= {{1,2},{2,1},{1,3},{3,1},{2,4},{4,2},{2,5},{5,2},{3,6},{6,3},{3,7},{7,3},{4,5},{5,4},{6,7},{7,6},{5,8},{8,5},{6,8},{8,6}};System.out.println("图形的邻接表的内容:");for(int i=1;i<9;i++) {run[i]=0;head[i]=new GraphLink();System.out.print("顶点"+i+"=>");for(int j=0;j<data.length;j++) {if(data[j][0]==i)head[i].insert(data[j][1]);}head[i].print();}System.out.println("深度优先遍历顶点:");BFS(1);  //调用广度优先搜索函数,从顶点1开始访问System.out.println();}
}

程序运行结果如下:

这里写图片描述


http://chatgpt.dhexx.cn/article/MfeMH95M.shtml

相关文章

图遍历详解(C语言版)

文章目录 一、定义二、方法1、深度优先遍历2、广度优先遍历 三、实现1、无向图或强连通有向图遍历2、非连通图遍历 结语附录 一、定义 从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发&#xff0c;按照某种搜索方法沿着图的边访问图中所有顶点&#xff0c;使每…

记录在遍历数据时,如何将数据的每一项中的个图片遍历出来

场景&#xff1a;商品评价页面&#xff0c;需将每一条评价显示出来&#xff0c;有图片评价的也要将图片显示出来 后端返回的接口数据格式如下&#xff1a; 如果是一张图片&#xff0c;在遍历外层的时候&#xff0c;用item.discuss_img就可以直接显示出来了&#xff0c;但多张图…

小程序轮播图遍历图片的方法

uniapp轮播图组件 方法一&#xff1a;直接使用图片 <swiper :indicator-dots"true" :autoplay"true" :interval"3000" :duration"1000" :circular"true"><swiper-item><image src"/static/swiper_img/…

图遍历算法

上一篇文章中我们简单介绍了什么是图和图分析&#xff0c;图分析的应用场景和优点&#xff0c;以及一些常用的图工具&#xff0c;这篇文章里将介绍一下简单的图遍历算法。 图的遍历 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发…

图的遍历(基础)

目录 一、图的遍历的相关定义 二、深度优先搜索 &#xff08;一&#xff09;深度优先搜索连通子图的基本思想 &#xff08;二&#xff09;采用递归的形式说明&#xff0c;则深度优先搜索连通子图的基本思想&#xff1a; &#xff08;三&…

图的遍历(深度优先遍历,DFS)

1.概念 图的遍历操作是从图中某一顶点出发&#xff0c;对图中所有顶点访问一次且仅访问一次 &#xff08;1&#xff09;在图中&#xff0c;遍历的起始顶点是编号最小的顶点 &#xff08;2&#xff09;某个起点到达不了所有顶点&#xff0c;则多次调用访问所有顶点 &#xf…

数据结构 第六章 图——图的遍历

6.5 图的遍历 在前面我们知道&#xff0c;树是一种非线性结构&#xff0c;为了方便它在计算机中的存储&#xff0c;对树进行遍历使它线性化。 而图同样也是一种非线性结构&#xff0c;但是图又是一种不同于树的多对多结构&#xff0c;所以在前面我们将其转换为了多个一对多的结…

数据结构——图(图的遍历)

图的遍历 图的遍历深度优先遍历&#xff08;DFS&#xff09;DFS算法效率分析深度优先遍历算法的实现广度优先搜索遍历&#xff08;BFS&#xff09;BFS算法效率分析DFS与BFS算法比较 图的遍历 遍历定义&#xff1a;从已给的连通图中某一顶点出发&#xff0c;沿着一些边访遍图中所…

图的遍历 (深度优先遍历和广度优先遍历)

一. 什么是深度优先遍历 深度优先遍历可定义如下&#xff1a;首先访问出发点v&#xff0c;并将其标记为已访问过&#xff1b;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过&#xff0c;则以w为新的出发点继续进行深度优先遍历&#xff0c;直至图中所有和源点v有路径相通的…

图的遍历

图的遍历 介绍 是从图的某一顶点出发&#xff0c;按照某种搜索方式对图中所有顶点访问一次且仅一次。图的遍历可以解决很多搜索问题&#xff0c;在实际中应用非常广泛。图的遍历根据搜索方式的不同&#xff0c;分为广度优先搜索和深度优先搜索。 一.深度优先遍历 1.1介绍 深…

视频和图片合成软件,简单快速合成视频和图片

怎么把小视频和图片合成起来&#xff1f;有简单好上手的教程吗&#xff1f;今天就教大家简单几步&#xff0c;把视频和图片合成为照片视频。先看看用数码大师合成视频和图片的效果截图&#xff1a; 第一步&#xff1a;把图片一次性导入&#xff0c;为照片配上文字 点击“添加…

多张图片怎么合成gif?

多张图片怎么合成gif&#xff1f;gif动图是我们比较熟悉的一种网络聊天表情包&#xff0c;通常都是由图片或者视频转换而来的。很多小伙伴会选择用PS来制作GIF动图&#xff0c;但并不是所有小伙伴都会使用PS&#xff0c;所以一个自动简单&#xff0c;可以将图片或者视频直接转换…

android将图片做成视频播放,如何把图片做成视频【图文教程】

教你怎么将手机拍摄的一张张图片整合转换成视频播放更唯美。下面以直走婚纱mv电子相册为例。 安装好软件&#xff0c;先运行绿化程序&#xff0c;然后再运行软件&#xff0c;详情请参看使用说明txt文档。打开之后&#xff0c;有两个模式供你选择&#xff0c;左边是标准模式、右…

php把图片合成视频,如何把照片做成视频 照片音乐视频制作 并插入几段短视频片段...

如何把照片制作成视频&#xff1f;相信大家都已经有所耳闻了&#xff0c;把平时手机或者相机上拍摄的照片&#xff0c;还有拍摄的视频都可以合起来&#xff0c;再添加背景音乐就成了一个非常有纪念价值的视频了。然而已经不是只有照片和音乐的视频了&#xff0c;整个视频全是照…

视频转图片-人脸识别-合成视频

视频转图片-人脸识别-合成视频 代码&#xff1a; import cv2 import os,sys import numpy as npface_xml cv2.CascadeClassifier(r"C:\Users\lenovo\Desktop\python\jiqixuexi\haarcascade_frontalface_default.xml") eye_xml cv2.CascadeClassifier(r"C:\U…

怎样用计算机合并视频,电脑视频合并软件 , 怎样把多个视频合成为一个

昨天小编在搜梁博的歌曲《表态》的视频时(这首歌小编觉得真的很好听推荐下)在一个剪辑视频发现他将梁博在某综艺唱的歌曲全都剪辑在视频里。这里就运用到了一个剪辑视频知识&#xff0c;合并视频。既然看到小编就准备跟大家伙讲讲这个视频剪辑内容。如何把多个视频合并在一个视…

php合成视频特效,视频合并加转场效果

热爱视频后期剪辑的朋友都会知道&#xff0c;在视频的后期制作过程中&#xff0c;常见操作中就有视频合并这一项&#xff0c;及在视频之间加入转场效果&#xff0c;为影视编辑作品带来绚丽多彩的视觉效果&#xff0c;不禁会使人眼前一亮。接下来给大家介绍一款简易好用的视频编…

php 图片生成视频,图片转化为视频的方法 如何将照片制作成为视频

点击上方的下载地址&#xff0c;然后将软件进行安装。安装完毕后&#xff0c;打开软件在这个界面可以选择软件的比例大小和操作模式&#xff0c;我们选择“4:3”和“全功能模式”。 接着我们将要进行操作的图片导入到软件&#xff0c;点击“导入”后在“打开”界面选中所有的图…

ffmpeg使用(多个帧合成视频)

帧生成视频命令&#xff1a; ffmpeg -threads 2 -y -r 24 -i %05d.jpg output.mp4 视频生成帧命令&#xff08;按帧生成图片&#xff09;&#xff1a; ffmpeg -i checkpoints_dstt_car-turn_result.mp4 chaifen/%06d.png 1、下载ffmpeg安装包 https://github.com/BtbN/FFmpe…

matlab jpg合成gif,用MATLAB将照片合成视频或者GIF图片、以及Photoshop制作GIF图片

用MATLAB将照片合成视频或者GIF图片、以及Photoshop制作GIF图片 一、用MATLAB将照片合成视频(我使用的MATLAB是2015版本的) (1)、你需要需要合成视频的图片。 所有照片放在一个文件夹里面因为是使用Matlab的dir函数读取照片,所以读取时,你要先设置好文件名:图片名称按照“00…