#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<deque>using   namespace   std;template <typename T> class Graph
{private:int Ne,Nv;//Nv为顶点数,Ne为边数T   *weight;//wieght为权重数组char    *data;//data保存顶点数据int     *visited;//用于遍历 void    coreDFS(int j){for(int i=0;i<Nv;i++){if(*(weight+j*Nv+i)==1 && !visited[i])//有邻接点{printf("%c",data[i]);visited[i]=true;coreDFS(i);//找下一个节点并打印} }   }public:Graph(int numV){Nv = numV;Ne = 0;weight = (T*)calloc(numV*numV*sizeof(int),1);data = (char*)calloc(numV,1);visited = (int*)calloc(numV*sizeof(int),1);//初始化数据 }bool    initVertexData(const char *d){if(strlen(d)>=Nv){strncpy(data,d,Nv);//只复制Nv个节点数据 return true;}else{return false;}}bool    insertEdge(char i,char j,T w)//有向图还是无向图 {int pi = strchr(data,i)-data;int pj = strchr(data,j)-data;if(pi<Nv&&pj<Nv){*(weight+pi*Nv+pj) = w;*(weight+pj*Nv+pi) = w;Ne++;//边数加1 return true;}else{return false;}}void    DFS(){memset(visited,0,Nv*sizeof(int));printf("\n");for(int i=0;i<Nv;i++)//对每个节点做一次深度遍历 {if(!visited[i]){visited[i]=true;printf("%c",data[i]);coreDFS(i);}}printf("\n");}void     BFS(){memset(visited,0,Nv*sizeof(int));//标记为没有访问过deque<int>  q;printf("\n");for(int i=0;i<Nv;i++)//进行广度优先搜索 {q.push_back(i);while(!q.empty()){int k = q.front();q.pop_front(); if(!visited[k]){//没有访问,先访问 printf("%c",data[k]);visited[k]=true;//标记为已访问 }for(int j=0;j<Nv;j++){if(*(weight+i*Nv+j)==1 && !visited[j]){printf("%c",data[j]);visited[j] = true;q.push_back(j);//下一次要遍历的顶点 }}}}printf("\n");}void    showSelf(){for(int i=0;i<Nv;i++){for(int j=0;j<Nv;j++){printf("%d\t",*(weight+i*Nv+j));}printf("\n");}}//用于调试,打印邻接表
};int main()
{  Graph<int>  g = Graph<int>(5);//建立一个有5个顶点的图,weight为int型g.initVertexData("abcde");g.insertEdge('a','b',1);g.insertEdge('a','c',1);g.insertEdge('c','e',1);g.insertEdge('a','d',1);g.insertEdge('e','d',1);cout << "深度遍历:";g.DFS();cout << "广度遍历:";g.BFS();g.showSelf();return 0;
}  

遍历的图:

结果:

C/C++实现图的广度和深度遍历相关推荐

  1. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

    上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...

  2. 【图】广度与深度遍历

    图的常用操作 FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号.若x没有邻接点或图中不存在x,则返回-1. NextNeighbor(G,x,y):假设图G中顶点y ...

  3. 图的深度优先遍历和宽度优先遍历C语言,图的广度、深度优先遍历 C语言

    以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include #include #include using namespa ...

  4. 二叉树广度和深度遍历的全部算法

    二叉树广度和深度遍历的全部算法 对于二叉树的遍历,有广度遍历和深度遍历两大类,对于深度遍历又分为先序.中序和后序,这三种先中后序又可以用递归和非递归两种算法来写,下面就分别对这两大类算法做个总结,以后 ...

  5. 邻接矩阵的存储方式实现图的广度和深度优先遍历

    在做图的邻接矩阵之前,先做好准备工作,定义存储类型,声明队列的操作(在广度优先遍历中使用) #include <stdio.h> #include <stdlib.h> #in ...

  6. 图---邻接矩阵 建立,深度遍历,广度遍历

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 图的存储 ...

  7. 图 邻接表 建立 深度遍历 广度遍历

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 图的邻接 ...

  8. [PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现

    1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历 2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历 3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联 ...

  9. python来进行图的深度遍历和广度遍历

    python来进行图的深度遍历和广度遍历 # -*- coding: utf-8 -*- """ Created on Sat Sep 14 18:01:27 2019@ ...

最新文章

  1. 多个勒索软件团伙利用VMware的Log4Shell漏洞
  2. Ajax实例(一)$.ajax的应用
  3. mysql5 7选路径_MySQL 5.5/5.6/5.7及以上版本安装包安装时如何选择安装路径
  4. routing zuul_尚学堂0131之zuul的相关概念及如何性能调优
  5. Esxi直通板载Sata
  6. [HNOI2004]L语言
  7. MySQL常见错误代码(转)
  8. C++米勒拉宾算法模板
  9. Sending and Receiving Binary Data
  10. AI学习笔记(十二)物体检测(上)
  11. 【C++】常用拷贝算法和替换算法
  12. python基本网络爬虫代码_Python实现网页爬虫基本实现代码解读
  13. 影子系统 重启蓝屏 开机蓝屏 安全模式蓝屏 进PE蓝屏 解决方案
  14. 计算机开机加载后进入不了xp,xp电脑开机后进不了系统怎么办
  15. c语言编程八卦方位,易经手掌八卦图,如何C语言编程画一个彩色的周易八卦图...
  16. 小白linux学习[1]__虚拟机NAT方式共享电信拨号上网
  17. 人工智能初步学习笔记
  18. python+selenium自动化软件测试(第1章)
  19. html2canvas实现网页局部存为图片和打印
  20. 工作经验分享:Spark调优【优化后性能提升1200%】

热门文章

  1. Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察
  2. 成功解决 利用plt.plot绘图时,横坐标出现浮点小数而不是整数的情况(坐标轴刻度)
  3. 成功解决File frozen importlib._bootstrap, line 219, in _call_with_frames_removed ImportError: DLL lo
  4. 盘点selenium phantomJS使用的坑
  5. OpenSession与getCurrentSession的区别
  6. 线程访问 DevExpress控件异常时 解决方法
  7. Coding 初级教程(二)——上传已有项目
  8. oracle 11g常用命令
  9. stm32之spi之NSS管脚信号
  10. Singleton Pattern(单例模式)