1. ////////////////////////////////////////////////////////
  2. //图的邻接矩阵的DFS和BFS
  3. ////////////////////////////////////////////////////////
  4. #include <iostream>
  5. #include <stdlib.h>
  6. #include <queue>
  7. #define MaxVertexNum 100 //最大顶点数
  8. //#define INFINITY 0 //无穷大设为无符号整数的最大值
  9. typedef char VertexType; //顶点类型设为字符类型
  10. typedef int EdgeType; ///边的权值设为整形
  11. enum GraphType{DG, UG, DN, UN}; //有向图,无向图,有向网图,无向网图
  12. using namespace std;
  13.  
  14. typedef struct
  15. {
  16. VertexType Vertices[MaxVertexNum]; //顶点表
  17. EdgeType Edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,即边表
  18. int n, e; //顶点数n和边数e
  19. enum GraphType GType;
  20. }MGraph;
  21.  
  22. void CreateMGraph(MGraph *G)
  23. {
  24. int i, j, k, w;
  25. G->GType = UN; /* Undirected Network 无向网图 */
  26. cout << "请输入顶点数和边数(输入格式为:顶点数, 边数):" << endl;
  27. cin >> G->n >> G->e; /* 输入顶点数和边数 */
  28. cout << "请输入顶点信息(输入格式为:顶点号<CR>):" << endl;
  29. for (i = ; i < G->n; i++)
  30. cin >> &(G->Vertices[i]); /* 输入顶点信息,建立顶点表 */
  31. for (i = ; i < G->n; i++)
  32. for (j = ; j < G->n; j++)
  33. G->Edges[i][j] = ; /* 初始化邻接矩阵 */
  34. cout << "请输入每条边对应的两个顶点的序号和权值,输入格式为:i, j, w:" << endl;
  35. for (k = ; k < G->e; k++) {
  36. cin >> i >> j >> w; /* 输入e条边上的权,建立邻接矩阵 */
  37. G->Edges[i][j] = w;
  38. G->Edges[j][i] = w; /* 因为无向网图的邻接矩阵是对称的 */
  39. }
  40. }
  41.  
  42. void Print(MGraph *G)
  43. {
  44. cout << " ";
  45. for (int i = ; i < G->n; i++)
  46. cout << G->Vertices[i] << " ";
  47. cout << endl;
  48. for (int i = ; i < G->n; i++)
  49. {
  50. cout << G->Vertices[i] << " ";
  51. for (int j = ; j < G->n; j++)
  52. {
  53. cout << G->Edges[i][j] << " ";
  54. }
  55. cout << endl;
  56. }
  57. }
  58.  
  59. //邻接矩阵存储的图 - DFS
  60. bool Visited[] = { false };
  61. void DFS(MGraph *G, int k)
  62. {
  63. cout << G->Vertices[k] << " ";
  64. Visited[k] = true;
  65. for (int i = ; i < G->n; i++)
  66. {
  67. if (G->Edges[k][i] == && Visited[i] == false)
  68. {
  69. DFS(G, i);
  70. }
  71. }
  72. }
  73.  
  74. //邻接矩阵存储的图 - BFS
  75. void BFS(MGraph *G, int k)
  76. {
  77. bool Visited[] = { false };
  78. queue<int> q;
  79. for (int i = ; i < G->n; i++)
  80. Visited[i] = false;
  81.  
  82. if (Visited[k] == false) //如果节点未访问
  83. {
  84. Visited[k] = true;
  85. cout << " visit vertex: " << G->Vertices[k] << endl;
  86. q.push(k); //u入队列
  87. }
  88. while (!q.empty())
  89. {
  90. int t = q.front();
  91. q.pop();
  92. for (int w = ; w < G->n; w++)
  93. {
  94. if (G->Edges[t][w] != && Visited[w] == false)
  95. {
  96. Visited[w] = true;
  97. cout << " visited vertex: " << G->Vertices[w] << endl;
  98. q.push(w);
  99. }
  100. }
  101. }
  102. }
  103. int main()
  104. {
  105. MGraph *G = new MGraph;
  106. CreateMGraph(G);
  107. Print(G);
  108. cout << endl;
  109. DFS(G, );
  110. //BFS(G, 0);
  111. system("pause");
  112. return ;
  113. }

测试截图:

数据结构(12) -- 图的邻接矩阵的DFS和BFS的更多相关文章

  1. c_ 数据结构_图_邻接矩阵

    程序主要实现了图的深度遍历和广度遍历. #include <stdio.h> #include <stdlib.h> #include <string.h> #de ...

  2. 邻接矩阵实现图的存储,DFS,BFS遍历

    图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...

  3. 数据结构(三十二)图的遍历(DFS、BFS)

    图的遍历和树的遍历类似.图的遍历是指从图中的某个顶点出发,对图中的所有顶点访问且仅访问一次的过程.通常有两种遍历次序方案:深度优先遍历和广度优先遍历. 一.深度优先遍历 深度优先遍历(Depth_Fi ...

  4. 图的遍历:DFS和BFS

    图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...

  5. 【数据结构与算法笔记04】对图搜索策略的一些思考(包括DFS和BFS)

    图搜索策略 这里的"图搜索策略"应该怎么理解呢? 首先,是"图搜索",所谓图无非就是由节点和边组成的,那么图搜索也就是将这个图中所有的节点和边都访问一遍. 其次 ...

  6. 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)

    邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...

  7. Java数据结构——图的DFS和BFS

    1.图的DFS: 即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访 ...

  8. 列出连通集(DFS及BFS遍历图) -- 数据结构

    题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...

  9. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

随机推荐

  1. JavaScript中typeof知多少?

    typeof运算符介 绍:typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型. 你 知道下面typeof运算的结果吗? typeof ...

  2. 多线程安全的HTTPCLIENT

    private static HttpClient httpClient;     static {           HttpParams params = new BasicHttpParams ...

  3. web开发workflow

    web development是一个创建和实施一个新的互联网展示的过程,web网站可以是个非常成熟包罗万象的网站,也可以只是一个blog或者一两个页面.如果未做好充分的准备,web开发将是一个非常复杂 ...

  4. core--主线程

    windows的线程是windows可以分配给cpu的最小单元,对window应用程序的管理,最小的管理单位就是线程.那什么是线程?线程其实什么都不是,只是一个概念,没有实体,又看不见.这个概念的定义 ...

  5. js之dom_1

    DOM    ie中有dom对象都是com对象的形式实现的    操作dom时,要注意返回的节点列表.属性列表都是动态的,会随着操作的改变而实时改变    document.getElementByI ...

  6. java.util.logging.Logger使用详解

    一.创建Logger对象   static Logger getLogger(String name)           为指定子系统查找或创建一个 logger. static Logger ge ...

  7. 模拟实现STL中的list

    #pragma once #include<iostream>using namespace std;#include<assert.h> template<class ...

  8. (转载)NSTimer

    转自:http://www.cnblogs.com/smileEvday/archive/2012/12/21/NSTimer.html 看到这个标题,你可能会想NSTimer不就是计时器吗,谁不会用 ...

  9. linux系统查看磁盘分区使用空间

    Df命令是linux系统以磁盘分区使用空间:df -hl

  10. acdream 1686 梦醒(时钟重合)

    Problem Description 娜娜离开了这个王国,走向远方,在旷野上,娜娜看到了一个大时钟,上面的时针分针秒针都在缓缓转动,那只挥着翅膀的天使又出现了,天使说:“外面天已经亮了,娜娜你别睡过 ...