图的遍历-邻接矩阵-dfs
来源:互联网 发布:淘宝企业店铺推广 编辑:程序博客网 时间:2024/03/28 19:44
- 定义:从图中的某一顶点出发访遍图中其余结点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。
- 深度优先遍历:从图的某个顶点 V 出发,访问此顶点,然后从 V 的未被访问的邻接点出发深度优先遍历图,直至图中所有和 v 有路径想通的顶点都被访问到。(对于连通图,非连通图应该,应该对它的连通分量分别进行深度优先遍历)
#include <iostream>using namespace std;#include "stdlib.h"#include "math.h"#include "time.h"// 无向图的创建#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXVEX 100 // 最大的顶点数#define INFINITY 65535#define MAXSIZE 9 // 初始化的分配量typedef int Boolean;Boolean visited[MAXSIZE];typedef int Status;typedef int VertexType ; // 顶点的类型typedef int EdgeType; // 边上权值的类型typedef struct{ VertexType vex[MAXVEX]; // 顶点表 EdgeType arc[MAXVEX][MAXVEX]; // 邻接矩阵 int numNodes, numEdges; // 图中当前的顶点数和边数}MGraph;void CreateMGraph(MGraph * G){ int i,j; int k,w; cout<<"输入顶点数和边数"<<endl; cin>>G->numNodes>>G->numEdges; for(i = 0;i <G->numNodes;i++) /* 读入顶点信息,建立顶点表 */ cin>>(G->vex[i]); for (i = 0; i < G->numNodes ; i++) { // 邻接矩阵初始化 for (j = 0; i < G->numNodes ; i++) { G->arc[i][j] = INFINITY; } } for(k = 0; k < G->numEdges; k++){ cout<<"输入边 (vi,vj)上的下标i,下标j,和权值w:"<<endl; cin>>i>>j>>w; G->arc[i][j] = w; G->arc[j][i] = G->arc[i][j]; // 无向图对称 }}void CreateMGraph1(MGraph * G){ int i, j; G->numEdges=15; G->numNodes=9; /* 读入顶点信息,建立顶点表 */ G->vex[0]='A'; G->vex[1]='B'; G->vex[2]='C'; G->vex[3]='D'; G->vex[4]='E'; G->vex[5]='F'; G->vex[6]='G'; G->vex[7]='H'; G->vex[8]='I'; for (i = 0; i < G->numEdges; i++)/* 初始化图 */ { for ( j = 0; j < G->numEdges; j++) { G->arc[i][j]=0; } } G->arc[0][1]=1; G->arc[0][5]=1; G->arc[1][2]=1; G->arc[1][8]=1; G->arc[1][6]=1; G->arc[2][3]=1; G->arc[2][8]=1; G->arc[3][4]=1; G->arc[3][7]=1; G->arc[3][6]=1; G->arc[3][8]=1; G->arc[4][5]=1; G->arc[4][7]=1; G->arc[5][6]=1; G->arc[6][7]=1; for(i = 0; i < G->numEdges; i++) { for(j = i; j < G->numEdges; j++) { G->arc[j][i] =G->arc[i][j]; } }}void DFS(MGraph G, int i){ int j; visited[i] = TRUE; cout<<G.vex[i]<<endl; for (j = 0; j < G.numNodes; j++) { if(G.arc[i][j] != 0 && visited[j] == FALSE) DFS(G, j); }}void DFSTraverse(MGraph G){ int i; for (int i = 0; i < G.numNodes; i++) { // 初始化所有访问的结点 visited[i] = FALSE; } for (i = 0 ; i < G.numNodes; i++) { if(!visited[i]) DFS(G,i); }}int main(int argc, const char * argv[]) { MGraph G; CreateMGraph1(&G); cout<<"深度遍历"<<endl; DFSTraverse(G); return 0;}
时间复杂度的分析:对于 n 个顶点 e 条边的图来说,邻接矩阵由于是二维数组,要查找每个顶点的临界点需要访问数组中的所有的元素,因此需要 O(n^2) 的时间。
0 0
- 图的遍历DFS【邻接矩阵】
- 图的遍历-邻接矩阵-dfs
- 图的邻接矩阵和DFS遍历
- 图之 宽度优先遍历 DFS 邻接矩阵建立的图
- 图的深度优先遍历DFS(邻接矩阵表示法)
- 图的邻接表 邻接矩阵 深度优先遍历DFS
- 无向图的邻接矩阵 -- DFS - 深度优先遍历
- 邻接矩阵实现图的存储,DFS,BFS遍历
- 邻接矩阵无向图的创建和遍历(dfs)
- 邻接矩阵的DFS 和 BFS 搜索遍历
- 邻接矩阵遍历(无向图,邻接矩阵,DFS,BFS)
- 图论 邻接矩阵建图+dfs遍历
- 图的遍历(邻接矩阵)
- 邻接矩阵的图遍历
- 图的遍历--邻接矩阵
- 图的邻接矩阵遍历
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 图的邻接矩阵及其遍历
- 2017第八届蓝桥杯C/C++ B组省赛题解
- NodeMCU读取dht11温湿度网页显示
- MySQL语法知识点
- 1012 u Calculate e
- JAVA基础易错选择题(笔试题文件流部分)
- 图的遍历-邻接矩阵-dfs
- HDU 5299 L
- mysql 的时间操作函数
- java一些基本知识(配置、debug调试、快捷键、junit test)
- 数据结构-栈:顺序栈与链栈的C++模板类实现
- 图的深度优先遍历
- 深入浅出SQL:4 聪明的表设计
- BZOJ4502: 串
- Java实现的字符串全排列算法