数据结构无向图的深度优先遍历

以下面的图片为例题,仅给出源代码,不谈算法思想。

#include <stdio.h>
#include <cstring>
#include <iostream>
#define MAX_VERTEX_NUM 20+3 //最大顶点数量
//#define true 1
//#define false 0
using namespace std;

typedef char VERTEX_TYPE; //顶点的类型

typedef struct node
{
   int vertex_num;    //顶点的数量
   int edge_num;      //边的数量
   VERTEX_TYPE vertex[MAX_VERTEX_NUM];//顶点信息
   int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  //邻接矩阵
   bool visited[MAX_VERTEX_NUM];  //用于深度搜索的
}Undigraph;//无向图

void init_undigraph(Undigraph *G)//初始化图
{
   G->vertex_num = G->edge_num = 0;
   memset(G->vertex,0,sizeof(G->vertex));
   memset(G->matrix,0,sizeof(G->matrix));
   memset(G->visited,0,sizeof(G->visited));  //应该可以用来初始化逻辑数组吧
}
void add_vertex(Undigraph *G)//增加顶点
{
   printf("请输入顶点的数量\n");
   cin>>G->vertex_num;//scanf("%d",&G->vertex_num);

   for(int i=0; i < G->vertex_num; ++i)
      cin>>G->vertex[i];//scanf("%c",&G->vertex[i]);
}
int locate_vertex(Undigraph *G,VERTEX_TYPE who)//寻找某个顶点的位置
{
   for(int index = 0; index < G->vertex_num; ++index)
      if( G->vertex[index] == who )
        return index;    //return 找不到
    return -1;//意味着没找到
}
void add_edge(Undigraph *G)//增加边
{
   printf("请输入边的数量\n");
   cin>>G->edge_num;//scanf("%d",&G->edge_num);

   for(int i=0; i < G->edge_num; ++i)
   {
      VERTEX_TYPE s1,s2;//边的两端的顶点
      cin>>s1>>s2;//scanf("%c %c",&s1,&s2);
      int index_1 = locate_vertex(G,s1);//找到这两个顶点所在的下标
      int index_2 = locate_vertex(G,s2);//同上
      G->matrix[index_1][index_2] = G->matrix[index_2][index_1] = 1;//矩阵是对称的
   }
}
void create_undigraph(Undigraph *G)//构造一个无向图
{
   add_vertex(G);//增加顶点
   add_edge(G);  //增加边
}
void DFS(Undigraph *G,int i)
{
   cout<<G->vertex[i];//printf("%c ",&G->vertex[i]);
   G->visited[i] = true;

   for(int j=0; j < G->vertex_num; ++j)
      if(G->matrix[i][j] == 1 && !G->visited[j])
        DFS(G,j);
}
void DFS_Traverse(Undigraph *G)
{
   for(int i=0; i < G->vertex_num; ++i)
      if(!G->visited[i])
        DFS(G,i);
}
int main(void)
{
   Undigraph G;
   init_undigraph(&G);//初始化无向图
   create_undigraph(&G);//构造一个无向图
   DFS_Traverse(&G);//深度优先遍历
   return 0;
}

时间: 2024-11-25 10:26:54

数据结构无向图的深度优先遍历的相关文章

数据结构?图的深度优先遍历

对于图这种数据结构,一般有两种遍历即深度优先(dfs),和广度优先(bfs),假设我们有如下这张图: 访问过程 现在假设计算0到其它点的路径,根据深度优先遍历: 1.获取0的所有邻边 1.2.5.6(默认此顺序) 2.再获取1的邻边(无),获取2的邻边(无),获取5的邻边(0,3,4) 3.0访问过,不再获取邻边:然后获取3的邻边(5,4) 4.5访问过,不再获取邻边:然后获取4的邻边(5,6) 5.5访问过,不再获取邻边:然后获取6的邻边(0,4) 6.0访问过,4被访问过,此时退到步骤2,即

数据结构 - 图的深度优先遍历(C++)

Boolean visited[MAX_VERTEX_NUM]; //访问标志数组. Status (*VisitFunc)(int v); //VisitFunc是访问函数,对图的每个顶点调用该函数. void DFSTraverse (Graph G, Status(*Visit)(int v)) //图的深度优先遍历. { VisitFunc = Visit; for(v=0; v<G.vexnum; ++v) visited[v] = FALSE; //访问标志数组初始化. for(v=

无向图 深度优先遍历 c语言实现

无向图的深度优先遍历的实现,无向图用邻接表表示无向图的表示:邻接矩阵和邻接表. 程序使用的示例图为: 实现要点: 每个节点有三种状态-1,0,1,分别表示未发现,已经发现,已经处理. 代码如下: #include <stdio.h> #include <stdlib.h> #include "graph_represent.h" //后序遍历图 void DFS(struct vNode** adj,int v,int* color){ struct vNode

图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过. 在此我想用一句话来形容 “不到南墙不回头”. 1.1 无向图的深度优先遍历图解 以下"无向图"为例: 对上无向图进行深度优先遍历,从A开始: 第1步:访问A. 第2步:访问B(A的邻接点). 在第1步访问A之后,接下来应该访问的是

数据结构:图的遍历--深度优先、广度优先

图的遍历:深度优先.广度优先 遍历 图的遍历是指从图中的某一顶点出发,按照一定的策略访问图中的每一个顶点.当然,每个顶点有且只能被访问一次. 在图的遍历中,深度优先和广度优先是最常使用的两种遍历方式.这两种遍历方式对无向图和有向图都是适用的,并且都是从指定的顶点开始遍历的.先看下两种遍历方式的遍历规则: 深度优先 深度优先遍历也叫深度优先搜索(Depth First Search).它的遍历规则:不断地沿着顶点的深度方向遍历.顶点的深度方向是指它的邻接点方向. 具体点,给定一图G=<V,E>,

数据结构(C实现)------- 图的深度优先遍历

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述: 假设给定图G的初始状态是所有顶点均未曾访问过,在G中任选一顶点vi为初始的出发点,则深度优先遍历可定义如下: 首先访问出发点vi,并将其标记为已被访问过:然后,依次从vi出发遍历vi的每一个邻接点vj,若vj未曾访问过,则以vj为新的出发点继续进行深度优先遍历,直至图中所有和vi有路径相通的顶点都被访问到为止.因此,若G是连通图,则从初始出发点开始的遍历过程结束

看数据结构写代码(40) 无向图的深度优先生成树与广度优先生成树

图的深度优先遍历 和 广度 优先 遍历 算法中的 每一次 最外层 循环 都 产生 一个 无向图 的 连通分量,每一个连通分量,都可以产生一个生成树,将这些生成树合在 一起 就是 一个 森林. 用 树的 孩子 兄弟 链表 表示法 来 表示 这个 森林, 就是 这一节 算法的  内容. 深度优先森林 代码 : //深度优先生成森林 void dfsTree(AMLGraph g,int i,Tree * t,bool isVisited[]){ isVisited[i] = true; bool i

邻接表的深度优先遍历

转载请注明出处http://www.cnblogs.com/hslzju 对<大话数据结构>P241——邻接表的深度优先遍历,进行了自己的理解并完善了代码. 邻接矩阵的深度优先遍历见http://www.cnblogs.com/hslzju/p/5399249.html 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接表的存储结构创建该图,再进行深度优先遍历.代码和解释如下(Qt Creator测试通过): 1 #include <iostream> 2 #include &

【图的遍历】广度优先遍历(DFS)、深度优先遍历(BFS)及其应用

无向图满足约束条件的路径 • 目的:掌握深度优先遍历算法在求解图路径搜索问题的应用 内容:编写一个程序,设计相关算法,从无向图G中找出满足如下条件的所有路径  (1)给定起点u和终点v.  (2)给定一组必经点,即输出的路径必须包含这些点.  (3)给定一组必避点,即输出的路径必须不能包含这些点. 来源:<数据结构教程(第五版)>李春葆著,图实验11. 原文地址:https://www.cnblogs.com/sunbines/p/9028903.html