数据结构(12) -- 图的邻接矩阵的DFS和BFS
- ////////////////////////////////////////////////////////
- //图的邻接矩阵的DFS和BFS
- ////////////////////////////////////////////////////////
- #include <iostream>
- #include <stdlib.h>
- #include <queue>
- #define MaxVertexNum 100 //最大顶点数
- //#define INFINITY 0 //无穷大设为无符号整数的最大值
- typedef char VertexType; //顶点类型设为字符类型
- typedef int EdgeType; ///边的权值设为整形
- enum GraphType{DG, UG, DN, UN}; //有向图,无向图,有向网图,无向网图
- using namespace std;
- typedef struct
- {
- VertexType Vertices[MaxVertexNum]; //顶点表
- EdgeType Edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,即边表
- int n, e; //顶点数n和边数e
- enum GraphType GType;
- }MGraph;
- void CreateMGraph(MGraph *G)
- {
- int i, j, k, w;
- G->GType = UN; /* Undirected Network 无向网图 */
- cout << "请输入顶点数和边数(输入格式为:顶点数, 边数):" << endl;
- cin >> G->n >> G->e; /* 输入顶点数和边数 */
- cout << "请输入顶点信息(输入格式为:顶点号<CR>):" << endl;
- for (i = ; i < G->n; i++)
- cin >> &(G->Vertices[i]); /* 输入顶点信息,建立顶点表 */
- for (i = ; i < G->n; i++)
- for (j = ; j < G->n; j++)
- G->Edges[i][j] = ; /* 初始化邻接矩阵 */
- cout << "请输入每条边对应的两个顶点的序号和权值,输入格式为:i, j, w:" << endl;
- for (k = ; k < G->e; k++) {
- cin >> i >> j >> w; /* 输入e条边上的权,建立邻接矩阵 */
- G->Edges[i][j] = w;
- G->Edges[j][i] = w; /* 因为无向网图的邻接矩阵是对称的 */
- }
- }
- void Print(MGraph *G)
- {
- cout << " ";
- for (int i = ; i < G->n; i++)
- cout << G->Vertices[i] << " ";
- cout << endl;
- for (int i = ; i < G->n; i++)
- {
- cout << G->Vertices[i] << " ";
- for (int j = ; j < G->n; j++)
- {
- cout << G->Edges[i][j] << " ";
- }
- cout << endl;
- }
- }
- //邻接矩阵存储的图 - DFS
- bool Visited[] = { false };
- void DFS(MGraph *G, int k)
- {
- cout << G->Vertices[k] << " ";
- Visited[k] = true;
- for (int i = ; i < G->n; i++)
- {
- if (G->Edges[k][i] == && Visited[i] == false)
- {
- DFS(G, i);
- }
- }
- }
- //邻接矩阵存储的图 - BFS
- void BFS(MGraph *G, int k)
- {
- bool Visited[] = { false };
- queue<int> q;
- for (int i = ; i < G->n; i++)
- Visited[i] = false;
- if (Visited[k] == false) //如果节点未访问
- {
- Visited[k] = true;
- cout << " visit vertex: " << G->Vertices[k] << endl;
- q.push(k); //u入队列
- }
- while (!q.empty())
- {
- int t = q.front();
- q.pop();
- for (int w = ; w < G->n; w++)
- {
- if (G->Edges[t][w] != && Visited[w] == false)
- {
- Visited[w] = true;
- cout << " visited vertex: " << G->Vertices[w] << endl;
- q.push(w);
- }
- }
- }
- }
- int main()
- {
- MGraph *G = new MGraph;
- CreateMGraph(G);
- Print(G);
- cout << endl;
- DFS(G, );
- //BFS(G, 0);
- system("pause");
- return ;
- }
测试截图:
数据结构(12) -- 图的邻接矩阵的DFS和BFS的更多相关文章
- c_ 数据结构_图_邻接矩阵
程序主要实现了图的深度遍历和广度遍历. #include <stdio.h> #include <stdlib.h> #include <string.h> #de ...
- 邻接矩阵实现图的存储,DFS,BFS遍历
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...
- 数据结构(三十二)图的遍历(DFS、BFS)
图的遍历和树的遍历类似.图的遍历是指从图中的某个顶点出发,对图中的所有顶点访问且仅访问一次的过程.通常有两种遍历次序方案:深度优先遍历和广度优先遍历. 一.深度优先遍历 深度优先遍历(Depth_Fi ...
- 图的遍历:DFS和BFS
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...
- 【数据结构与算法笔记04】对图搜索策略的一些思考(包括DFS和BFS)
图搜索策略 这里的"图搜索策略"应该怎么理解呢? 首先,是"图搜索",所谓图无非就是由节点和边组成的,那么图搜索也就是将这个图中所有的节点和边都访问一遍. 其次 ...
- 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)
邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...
- Java数据结构——图的DFS和BFS
1.图的DFS: 即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访 ...
- 列出连通集(DFS及BFS遍历图) -- 数据结构
题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
随机推荐
- JavaScript中typeof知多少?
typeof运算符介 绍:typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型. 你 知道下面typeof运算的结果吗? typeof ...
- 多线程安全的HTTPCLIENT
private static HttpClient httpClient; static { HttpParams params = new BasicHttpParams ...
- web开发workflow
web development是一个创建和实施一个新的互联网展示的过程,web网站可以是个非常成熟包罗万象的网站,也可以只是一个blog或者一两个页面.如果未做好充分的准备,web开发将是一个非常复杂 ...
- core--主线程
windows的线程是windows可以分配给cpu的最小单元,对window应用程序的管理,最小的管理单位就是线程.那什么是线程?线程其实什么都不是,只是一个概念,没有实体,又看不见.这个概念的定义 ...
- js之dom_1
DOM ie中有dom对象都是com对象的形式实现的 操作dom时,要注意返回的节点列表.属性列表都是动态的,会随着操作的改变而实时改变 document.getElementByI ...
- java.util.logging.Logger使用详解
一.创建Logger对象 static Logger getLogger(String name) 为指定子系统查找或创建一个 logger. static Logger ge ...
- 模拟实现STL中的list
#pragma once #include<iostream>using namespace std;#include<assert.h> template<class ...
- (转载)NSTimer
转自:http://www.cnblogs.com/smileEvday/archive/2012/12/21/NSTimer.html 看到这个标题,你可能会想NSTimer不就是计时器吗,谁不会用 ...
- linux系统查看磁盘分区使用空间
Df命令是linux系统以磁盘分区使用空间:df -hl
- acdream 1686 梦醒(时钟重合)
Problem Description 娜娜离开了这个王国,走向远方,在旷野上,娜娜看到了一个大时钟,上面的时针分针秒针都在缓缓转动,那只挥着翅膀的天使又出现了,天使说:“外面天已经亮了,娜娜你别睡过 ...