图的遍历是树的遍历的推广,是按照某种规则(或次序)访问图中各顶点依次且仅一次的操作,亦是将网络结构按某种规则线性化的过程。
由于图存在回路,为区别一顶点是否被访问过和避免顶点被多次访问,在遍历过程中,应记下每个访问过的顶点,即每个顶点对应有一个标志位,初始为False,一旦该顶点被访问,就将其置为True,以后若又碰到该顶点时,视其标志的状态,而决定是否对其访问。
对图的遍历通常有"深度优先搜索"和"广度优先搜索"方法,二者是人工智能的一个基础。
深度优先搜索(Depth First Search,简称DFS)
算法思路:
类似树的先根遍历。设初始化时,图中各顶点均未被访问,从图中某个顶点(设为V0)出发,访问V0,然后搜索V0的一个邻接点Vi,若Vi未被访问,则访问之,在 搜索Vi的一个邻接点(深度优先)...。若某顶点的邻接点全部访问完毕,则回溯(Backtracking)到它的上一顶点,然后再从此顶点又按深度优先的方法搜索下去,...,直到能访问的顶点都访问完毕为止。
设图G10如下图所示:
通过深度优先如下:
广度优先搜索(Breadth First Search),简称BFS
算法思路:
类似树的按层次遍历。初始时,图中各顶点均未被访问,从图中某顶点(V0)出发,访问V0,并依次访问V0的各邻接点(广度优先)。然后,分别从这些被访问过的顶点出发,扔仍按照广度优先的策略搜索其它顶点,....,直到能访问的顶点都访问完毕为止。
为控制广度优先的正确搜索,要用到队列技术,即访问完一个顶点后,让该顶点的序号进队。然后取相应队头(出队),考察访问过的顶点的各邻接点,将未访问过的邻接点访问 后再依次进队,...,直到队空为止。
通过广度优先如下:
下面看一下实现代码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX 20
- //访问记录
- int visit[MAX];
- //图的结构设计
- typedef struct
- {
- int vex[MAX];//记录顶点
- int adjmatrix[MAX][MAX];//邻接矩阵
- int n;//顶点的个数
- }GRAPH;
- //初始化图
- int init_graph(GRAPH *pG)
- {
- memset(pG,0,sizeof(GRAPH));
- pG->n = -1;
- printf("input vex\n");
- while(scanf("%d",&pG->vex[++pG->n]));
- while(getchar() != '\n');
- #ifndef _DEBUG_
- int i = 0;
- for(i = 0;i < pG->n ;i ++)
- {
- printf("V%d ",pG->vex[i]);
- }
- printf("\n");
- #endif
- return 0;
- }
- //获取顶点的位置
- int locatevex(GRAPH *pG,int vex)
- {
- int i = 0;
- for(i = 0;i < pG->n;i ++)
- {
- if(pG->vex[i] == vex )
- return i;
- }
- return 0;
- }
- //输入图的顶点之间的边
- int input_edge(GRAPH *pG)
- {
- int vex1,vex2;
- int i,j;
- printf("input edge(i,j):\n");
- //任意字母键结束
- while(scanf("(%d,%d)",&vex1,&vex2))
- {
- getchar();
- i = locatevex(pG,vex1);
- j = locatevex(pG,vex2);
- pG->adjmatrix[i][j] = pG->adjmatrix[j][i] = 1;
- }
- #ifndef _DEBUG_
- int m,n;
- for(m = 0;m < pG->n;m ++)
- {
- for(n = 0;n < pG->n; n ++)
- {
- printf("%d ",pG->adjmatrix[m][n]);
- }
- printf("\n");
- }
- #endif
- return 0;
- }
- //栈的设计
- typedef struct
- {
- int buf[MAX];
- int n;
- }Stack;
- //创建空栈
- Stack *create_empty_stack()
- {
- Stack *stack;
- stack = (Stack *)malloc(sizeof(Stack));
- stack->n = -1;
- return stack;
- }
- //出栈
- int pop_stack(Stack *stack)
- {
- int temp;
- temp = stack->buf[--stack->n];
- // stack->n --;
- return temp;
- }
- //入栈
- int push_stack(Stack *stack,int data)
- {
- stack->n ++;
- stack->buf[stack->n] = data;
- return 0;
- }
- //判断空栈
- int is_empty_stack(Stack *stack)
- {
- if(stack->n == -1)
- return 1;
- else
- return 0;
- }
- int visit_all(GRAPH *pG)
- {
- int i = 0;
- for(i = 0;i < pG->n; i ++)
- {
- if(visit[i] != 1)
- break;
- }
- if(i == pG->n)
- return 1;
- else
- return 0;
- }
- //图的深度非递归遍历
- int DFS(GRAPH *pG,int v)
- {
- Stack *stack;
- int i = 0;
- stack = create_empty_stack();
- push_stack(stack,pG->vex[v]);
- visit[v] = 1;
- printf("V%d ",pG->vex[v]);
- while(!is_empty_stack(stack) || !visit_all(pG))
- {
- for(i = 0;i < pG->n;i ++)
- {
- if(visit[i] == 0 && pG->adjmatrix[v][i] == 1)
- break;
- }
- if(i == pG->n)
- {
- v = pop_stack(stack);
- }else{
- v = i;
- push_stack(stack,pG->vex[v]);
- visit[v] = 1;
- printf("V%d ",pG->vex[v]);
- }
- }
- printf("\n");
- return 0;
- }
- //队列的设计
- typedef struct node
- {
- int data;
- struct node *next;
- }ListNode;
- typedef struct
- {
- ListNode *front;
- ListNode *rear;
- }Queue;
- //创建空队列
- Queue *create_empty_queue()
- {
- Queue *queue;
- ListNode *head;
- queue = (Queue *)malloc(sizeof(Queue));
- head = (ListNode *)malloc(sizeof(ListNode));
- queue->front = queue->rear = head;
- return queue;
- }
- //判断队列是否为空
- int is_empty_queue(Queue *queue)
- {
- if(queue->rear == queue->front)
- return 1;
- else
- return 0;
- }
- //入队
- int EnterQueue(Queue *queue,int data)
- {
- ListNode *temp;
- temp = (ListNode *)malloc(sizeof(ListNode));
- temp->data = data;
- temp->next = NULL;
- queue->rear->next = temp;
- queue->rear = temp;
- return 0;
- }
- //出队
- int DelQueue(Queue *queue)
- {
- ListNode *temp;
- temp = queue->front;
- queue->front = queue->front->next;
- free(temp);
- temp = NULL;
- // 由于队列初始化时,front指向头指针,所以出队列时,返回的数据是头指针的next指针的数据,而不是头指针的数据
- // 所以当队列为空时,队列front,rear指针是同时指向最后一个节点指针的,而这个节点保存的数据就是最后插入队列的数据,但此时队列已经为空了。
- return queue->front->data;
- }
- //图的广度遍历
- int BFS(GRAPH *pG,int v)
- {
- Queue *queue = create_empty_queue();
- int i = 0;
- memset(&visit,0,sizeof(visit));
- EnterQueue(queue,v);
- visit[v] = 1;
- while(!is_empty_queue(queue))
- {
- v = DelQueue(queue);
- printf("V%d ",pG->vex[v]);
- for(i = 0;i < pG->n;i ++)
- {
- if(visit[i] == 0 && pG->adjmatrix[v][i] == 1)
- {
- EnterQueue(queue,i);
- visit[i] = 1;
- }
- }
- }
- printf("\n");
- return 0;
- }
- int main()
- {
- GRAPH G;
- int n;
- //输入顶点,初始化图
- init_graph(&G);
- //初始化邻接矩阵
- input_edge(&G);
- //图的深度遍历
- DFS(&G, 0);
- //图的广度遍历
- BFS(&G,0);
- return 0;
- }
输出结果:
相关推荐
在本项目"ParseWord07Test(EasyPOi word隐藏边框+图片遍历导出)"中,我们将重点讨论如何使用EasyPOI处理Word文档中的隐藏边框以及图片遍历导出。 首先,我们来看标题中提到的"隐藏边框"。在Word文档中,边框用于...
本话题将深入探讨如何实现"图片遍历及显示"的功能,这涉及到文件操作、图片加载以及用户界面(UI)的设计。我们将重点关注`ListView`的使用以及如何遍历文件夹来获取图片文件。 首先,`ListView`是Android UI框架中...
本Windows版的图遍历演示程序旨在帮助用户直观地理解并操作深度遍历(Depth First Search, DFS)和广度遍历(Breadth First Search, BFS)这两种基本的图遍历方法。该程序不仅提供了图形界面,允许用户自行绘制和...
有向图遍历int visited[m]; typedef struct node { int data; struct node *next; }linkqueuenode;
在计算机科学中,图遍历是一种重要的算法,用于在图数据结构中访问所有节点。本文主要探讨了在连通无向图上的两种遍历方法——深度优先搜索(DFS)和广度优先搜索(BFS),并结合C++编程语言进行了实践。 深度优先...
根据给定的信息,本文将详细解释如何利用栈(Stack)数据结构来实现强连通图(Strongly Connected Graph)的遍历(Traversal)。在计算机科学领域,图论是一种常用的数据结构,而图的遍历是处理图形问题时的一项基本...
多张图片遍历命名,快速方便,简洁易懂,可以解决很多问题,批量命名
JavaScript应用实例-图片遍历颜色.js
### 图遍历的演示实习报告知识点解析 #### 一、需求分析 - **存储结构**:采用邻接多重表作为图的基本存储结构。邻接多重表是一种用于存储无向图的有效方式,它不仅可以存储图的基本信息(如顶点和边),还可以...
在数据结构领域,图遍历是一项基础且重要的操作,它为许多复杂的图算法提供了基石。在本次综合课设中,我们需要实现的是针对无向图的深度优先遍历(DFS)和广度优先遍历(BFS)。 无向图是一种特殊的图结构,其中...
根据给定文件的信息,我们可以总结出以下关于图遍历(特别是使用C语言实现)的知识点: ### 一、图的基本概念 #### 1. 图的定义 - 图是一种非线性的数据结构,由顶点(Vertex)和边(Edge)组成。 - 顶点:图中的...
AutoJs源码-图片遍历颜色。本资源购买前提醒:本源码都是实际autojs项目模板,安装好autojs直接运行即可打开。1、支持低版本autojs。2、资源仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您自己承担!...
在数据结构的学习中,图遍历是一项至关重要的概念,它涉及到如何系统地访问图中的所有节点,以便理解和处理复杂的网络关系。在这个“图遍历的演示 数据结构课程设计”项目中,我们主要会探讨两种主要的图遍历方法:...
根据给定的文件信息,我们可以深入探讨图遍历在计算机科学中的重要性和应用,以及C++语言中实现图遍历的具体方法。以下是对文件标题、描述、标签和部分内容的详细解读,聚焦于“图遍历”这一核心概念。 ### 图遍历...
这个任务涉及到了“线程遍历网站文件夹及子文件夹下所有图片并生成图片URL”,这是一个典型的文件系统操作结合多线程处理的问题。下面将详细介绍这个知识点。 首先,我们需要理解“遍历文件夹及子文件夹下所有图片...
无向图主要包括双方面内容,图的遍历和寻找联通分量。 无向图的遍历 无向图的遍历有两种方式—广度优先搜索(BFS)和深度优先搜索(DFS)。广度优先搜索在遍历一个顶点的全部节点时,先把当前节点全部相邻节点遍历了。...
二叉树遍历和图遍历是数据结构与算法领域中的重要概念,广泛应用于软件开发、计算机科学教学以及各种计算问题的求解。本系统旨在通过动态演示来帮助理解和掌握这两种遍历方法,并且提供了完整的C语言算法描述,以...
图遍历生成树的完美演示,即可从键盘输入来生成图,又可从文件中读入图!