图6——深度遍历无向图
设计一个递归算法,采用深度优先搜索对无向图进行遍历,并对算法中的无向图的存储结构予以简单的说明。
这是大连理工考研试题。
在深度优先的遍历过程中,图中可能存在回路,因此,在访问了某个顶点后,沿着某条路径遍历,有可能又回到该顶点。例如,对于下图中的无向图G
在访问了顶点a之后,接着访问顶点b、e、h、i、f、j、d。因为d的邻接顶点是a,沿着<d,a>会再次访问顶点a。为了避免再次访问已经访问过的顶点,需要设置一个数组visited[n],记录结点是否已被访问。
算法思想:定义一个数组visited[],记录顶点是否被访问过,初始时为0,访问过记为1,然后对每个没有被访问过的顶点进行深度遍历,若某个顶点u未被访问,则输出该顶点,然后将该顶点标记为已经访问,然后准备遍历u的第一个邻接顶点v,若u的这个邻接顶点v还没有被访问过,则对该顶点v进行深度优先遍历,若v的所有邻接顶点都已经被访问,则开始遍历u的其他邻接顶点。重复上述过程,直到所有的顶点都已经被访问过。
如下图的深度优先遍历为a、b、e、h、i、f、j、d、g、c。
code:
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define MAXSIZE 100
typedef enum { DG, DN, UG, UN }GraphKind;
typedef struct ArcNode
{int adjvex;InfoPtr *info;struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{VertexType data;ArcNode *firstarc;}VNode,AdjList[MAXSIZE];
typedef struct
{AdjList vertex;int vexnum, arcnum;GraphKind kind;
}AdjGraph;int LocateVertex(AdjGraph G, VertexType v);
void CreateGraph(AdjGraph *G);
void DisplayGraph(AdjGraph G);
void DestroyGraph(AdjGraph *G);
void DFSTraverse(AdjGraph G);
int LocateVertex(AdjGraph G, VertexType v)
{int i;for (i = 0; i < G.vexnum;i++){if (strcmp(G.vertex[i].data,v)==0){return i;}}return -1;
}void CreateGraph(AdjGraph *G)
{int i, j, k;VertexType v1, v2;ArcNode *p;cout << "请输入图的顶点数和边数:";cin >> (*G).vexnum >> (*G).arcnum;cout << "请输入" << G->vexnum << "个顶点的值:" << endl;for (i = 0; i < G->vexnum;i++){cin >> G->vertex[i].data;G->vertex[i].firstarc = NULL;}cout << "请输入弧尾 弧头:" << endl;for (k = 0; k < G->arcnum;k++){cin >> v1 >> v2;i = LocateVertex(*G, v1);j = LocateVertex(*G, v2);p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;p->info = NULL;p->nextarc = G->vertex[i].firstarc;G->vertex[i].firstarc = p;p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = i;p->info = NULL;p->nextarc = G->vertex[j].firstarc;G->vertex[j].firstarc = p;}(*G).kind = UG;
}
void DestroyGraph(AdjGraph *G)
{int i;ArcNode *p, *q;for (i = 0; i < (*G).vexnum;i++){p = G->vertex[i].firstarc;if (p!=NULL){q = p->nextarc;free(p);p = q;}}(*G).vexnum = 0;(*G).arcnum = 0;
}void DFS(AdjGraph G, int i, int visited[])
{ArcNode *p;if (!visited[i]){cout << G.vertex[i].data << " ";}visited[i] = 1;p = G.vertex[i].firstarc;while (p!=NULL){if (!visited[p->adjvex]){DFS(G, p->adjvex, visited);}p = p->nextarc;}
}void DFSTraverse(AdjGraph G)
{int v, u, visited[MAXSIZE];for (v = 0; v < G.vexnum;v++){visited[v] = 0;}for (u = 0; u < G.vexnum;u++){if (!visited[u]){DFS(G, u, visited);}}
}void DisplayGraph(AdjGraph G)
{int i;ArcNode *p;cout << G.vexnum << "个顶点:" << endl;for (i = 0; i < G.vexnum;i++){cout << G.vertex[i].data << " ";}cout << endl << G.arcnum << "条边:" << endl;for (i = 0; i < G.vexnum;i++){p = G.vertex[i].firstarc;while (p){cout << G.vertex[i].data << "->" << G.vertex[p->adjvex].data << " ";p = p->nextarc;cout << endl;}}}
void main()
{AdjGraph G;cout << "采用邻接矩阵创建无向图G:" << endl;CreateGraph(&G);cout << "输出无向图G的邻接表:" << endl;DisplayGraph(G);cout << "深度优先遍历无向图G: " << endl;DFSTraverse(G);cout << endl;DestroyGraph(&G);system("pause");}
结果:
a b c d e f g h i ja b
a c
a d
d f
d g
f j
f i
e i
e h
b e
图6——深度遍历无向图相关推荐
- sdut 图的深度遍历
图的深度遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 请定一个无向图 ...
- python来进行图的深度遍历和广度遍历
python来进行图的深度遍历和广度遍历 # -*- coding: utf-8 -*- """ Created on Sat Sep 14 18:01:27 2019@ ...
- 图的深度遍历(邓俊辉版)
文章目录 一.说在前面 二.代码实现和输出 一.说在前面 邓老师把图的边分成了4种:tree,backward,forward,cross.个人觉得,这样分的意义就在于对遍历树来说,原图的各条边各自有 ...
- 图的深度遍历和广度遍历算法
图的深度遍历和广度遍历算法 图的深度遍历可以简单理解为一条道走到黑,首先访问图中任一起始顶点v,再访问与v顶点邻接且未被访问过的顶点w1,再访问与w1邻接且未被访问过的顶点w2,重复上述操作,若不能继 ...
- 图的深度遍历和广度遍历
理论部分 图的深度遍历和广度遍历都不算很难像极了二叉树的前序遍历和层序遍历,如下面的图,可以用右边的邻接矩阵进行表示,假设以顶点0开始对整幅图进行遍历的话,两种遍历方式的思想如下: 1. 深度优先遍历 ...
- 实验报告C语言实现图的深度遍历,图的深度优先遍历的C语言实现.pdf
图的深度优先遍历的C语言实现.pdf 维普资讯 九 江 职 业 技 术 学 院 学 报 JournalofJiujiangVocational&TechnicalCollege 2004.2 ...
- 【数据结构】图的深度遍历与广度遍历
图是一种常见的数据格式,它的遍历主要分为两种: 深度优先遍历(DFS):类似于二叉树的前序前序遍历 广度优先遍历(BFS):类似于二叉树的层次遍历 一.出度与入度 在讲图的遍历之前,我们需要先了解图的 ...
- 图的深度遍历 (邻接矩阵)
知识讲解: 图的遍历分为两种,深度遍历与广度遍历.这里讨论深度遍历. 以上图为例讨论图(图片来自<算法笔记>)的深度遍历: 设图形的顶点数为n. 先从顶点v0开始,用一个数组vis[n]来 ...
- html递归遍历,图的深度遍历是一个递归过程
数据结构问题:图的深度优先遍历中有递归的应用,数据结构问题:图的深度优先遍历中有递归的应用,要用到栈,图中顶点是首先你得明白函数调用本身就是通过栈来实现的. 调用函数是入栈,而函数返回是出栈. 为什么 ...
- 数据结构——图的深度遍历
图的遍历方式有两种, 深度优先 广度优先 深度优先采用的是递归的方式来来实现,思想如下: 假设给定图G的初态是所有顶点均未曾访问过.在G中任选一顶点v为初始出发点(源点), **则深度优先遍历可定义如 ...
最新文章
- [dp之路]7.25test
- 莱斯分布概率分布曲线
- [云炬创业基础笔记]第六章商业模式测试20
- mysql主从复制的binlog和relay-log的区别
- 产品总监如何做产品规划?
- win10电脑怎么升级安装win11正式版,电脑升级win11的方法
- postgresql-定时备份,压缩备份
- unity 世界坐标间角度_Unity 世界坐标局部坐标下的旋转
- Unity3D Maze 迷宫生成算法
- 幽默故事:1、我喜欢的女神;2、农村淑女(木子家原创)
- mysql设置不用科学记数法,关闭科学记数法MySQL
- iOS 设置中清除缓存功能
- LabVIEW概述及其优点
- Vivado仿真小技巧,让所有模块的波形都可以显示
- 【SQL】查找重复的数据
- 【已解决】adb connect x.x.x.x:5555报错由于 目标计算机积极拒绝,无法连接
- 正方形UVa201-紫书习题4-2(详细解答)
- 英语水平低,能学好编程吗?
- 秒杀系统的设计五大原则
- TopCoat前端框架