矩阵图的深度广度遍历
时间:2022-04-22
本文章向大家介绍矩阵图的深度广度遍历,主要内容包括图的数据结构、矩阵图的深度优先遍历、矩阵图的广度优先遍历、示例图、示例代码、运行结果、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
图的常用表示方法就是矩阵和邻接表。
矩阵通常使用与规整的,且数据量较小的图,这种图直观上方便的表示出了图之间节点的相互关系。
图的数据结构
typedef struct Graph_Matrix{
char vers[NUM]; //存储数据表示
int arc[NUM][NUM];//二维矩阵图,用来表示节点相连情况
int numVer,numEdge;//顶点数,和边数
}Graph_Matrix;
矩阵图的深度优先遍历
为了防止图中有不连通的子图,因此每个节点顺序的遍历一次,每次采用深度优先遍历其联通子图,避免了遗漏节点。
有点类似书中遍历玩父节点,直接遍历他的左边孩子,然后再回来....
int DFS(Graph_Matrix *g,int i){
int j;
visited[i] = 1;
printf("%c ",g->vers[i]);
for(j=0;j<g->numVer;j++){
if(g->arc[i][j] == 1 && !visited[j])
DFS(g,j);
}
}
void DFSTraverse(Graph_Matrix *g){
int i;
for(i=0;i<g->numVer;i++)
visited[i] = 0;
for(i=0;i<g->numVer;i++){
if(!visited[i])
DFS(g,i);
}
}
矩阵图的广度优先遍历
广度优先遍历,主要依赖于一个队列,每次遍历一个父节点,寻找他的子节点一次放入队列中,遍历完,读取队列中的队头,在此读取其子节点,有点类似树中遍历父节点后,在遍历他的孩子节点。
void BFSTraverse(Graph_Matrix *g){
int i,j;
Queue *q = (Queue *)malloc(sizeof(Queue));
for(i=0;i<g->numVer;i++)
visited[i] = 0;
initQueue(q,0);
for(i=0;i<g->numVer;i++){
if(!visited[i]){
visited[i] = 1;
printf("%c ",g->vers[i]);
inQueue(q,i);
while(getLength(q)){
int *tar = (int *)malloc(sizeof(int));
outQueue(q,tar);
for(j=0;j<g->numVer;j++){
if(g->arc[*tar][j] == 1 && !visited[j]){
visited[j] = 1;
printf("%c ",g->vers[j]);
inQueue(q,j);
}
}
}
}
}
}
示例图
示例代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define NUM 5
4 #define MAXSIZE NUM
5 typedef struct Graph_Matrix{
6 char vers[NUM];
7 int arc[NUM][NUM];
8 int numVer,numEdge;
9 }Graph_Matrix;
10
11 typedef struct Queue{
12 int data[NUM];
13 int front;
14 int rear;
15 }Queue;
16
17 void initQueue(Queue *q,int n);
18 void showQueue(Queue *q);
19 int getLength(Queue *q);
20 int inQueue(Queue *q,int num);
21 int outQueue(Queue *q,int *tar);
22
23 void createGraph(Graph_Matrix *g);
24 void showGraph(Graph_Matrix *g);
25 int visited[NUM];
26 int DFS(Graph_Matrix *g,int i);
27 void DFSTraverse(Graph_Matrix *g);
28 void BFSTraverse(Graph_Matrix *g);
29
30 int main()
31 {
32 Graph_Matrix * g1 = (Graph_Matrix *)malloc(sizeof(Graph_Matrix));
33 createGraph(g1);
34 showGraph(g1);
35 printf("n");
36 DFSTraverse(g1);
37 printf("n");
38 BFSTraverse(g1);
39 return 0;
40 }
41
42 void createGraph(Graph_Matrix *g){
43 int i;
44 int j;
45 g->numEdge = 0;
46 for(i=0;i<NUM;i++){
47 g->vers[i] = 65+i;
48 }
49 for(i=0;i<NUM;i++){
50 for(j=0;j<NUM;j++){
51 if(i != j){
52 g->arc[i][j] = 1;
53 g->numEdge++;
54 }
55 else
56 g->arc[i][j] = 0;
57 }
58 }
59 g->arc[2][3] = g->arc[3][2] = 0;
60 g->arc[1][2] = g->arc[2][1] = 0;
61 g->numEdge -= 4;
62 g->numEdge = g->numEdge/2;
63 g->numVer = 5;
64 }
65 void showGraph(Graph_Matrix *g){
66 int i,j;
67 for(i=0;i<g->numVer;i++){
68 printf("%c ",g->vers[i]);
69 }
70 printf("n");
71
72 for(i=0;i<g->numVer;i++){
73 for(j=0;j<g->numVer;j++){
74 printf("%d ",g->arc[i][j]);
75 }
76 printf("n");
77 }
78 printf("vertexes:%d edges:%d",g->numVer,g->numEdge);
79 }
80
81 int DFS(Graph_Matrix *g,int i){
82 int j;
83 visited[i] = 1;
84 printf("%c ",g->vers[i]);
85 for(j=0;j<g->numVer;j++){
86 if(g->arc[i][j] == 1 && !visited[j])
87 DFS(g,j);
88 }
89 }
90 void DFSTraverse(Graph_Matrix *g){
91 int i;
92 for(i=0;i<g->numVer;i++)
93 visited[i] = 0;
94 for(i=0;i<g->numVer;i++){
95 if(!visited[i]) //如果是连通图,只会执行一次
96 DFS(g,i);
97 }
98 }
99
100 void BFSTraverse(Graph_Matrix *g){
101 int i,j;
102 Queue *q = (Queue *)malloc(sizeof(Queue));
103 for(i=0;i<g->numVer;i++)
104 visited[i] = 0;
105 initQueue(q,0);
106 for(i=0;i<g->numVer;i++){
107 if(!visited[i]){
108 visited[i] = 1;
109 printf("%c ",g->vers[i]);
110 inQueue(q,i);
111 while(getLength(q)){
112 int *tar = (int *)malloc(sizeof(int));
113 outQueue(q,tar);
114 for(j=0;j<g->numVer;j++){
115 if(g->arc[*tar][j] == 1 && !visited[j]){
116 visited[j] = 1;
117 printf("%c ",g->vers[j]);
118 inQueue(q,j);
119 }
120 }
121 }
122 }
123 }
124 }
125
126 void initQueue(Queue *q,int n){
127 int i;
128 q->front=0;
129 q->rear =0;
130 for(i=0;i<n;i++){
131 q->data[q->rear]=2*i+1;
132 q->rear++;
133 }
134 }
135 void showQueue(Queue *q){
136 int i;
137 int len=getLength(q);
138 printf("front-");
139 for(i=0;i<len;i++){
140 if(q->front+i<MAXSIZE)
141 printf("%d-",q->data[q->front+i]);
142 else
143 printf("%d-",q->data[q->front+i-MAXSIZE]);
144 }
145 printf("rearn");
146 }
147 int getLength(Queue *q){
148 return (q->rear-q->front+MAXSIZE)%MAXSIZE;
149 }
150 int inQueue(Queue *q,int num){
151 if((q->rear+1)%MAXSIZE == q->front)
152 return 0;
153 q->data[q->rear] = num;
154 q->rear = (q->rear+1)%MAXSIZE;
155 return 1;
156 }
157 int outQueue(Queue *q,int *tar){
158 if(q->front == q->rear)
159 return 0;
160 *tar = q->data[q->front];
161 q->front = (q->front+1)%MAXSIZE;
162 return 1;
163 }
运行结果
- 利用mk-table-checksum监测Mysql主从数据一致性操作记录
- mysql主从同步(4)-Slave延迟状态监控
- 浏览器窗口尺寸改变时的图片自动重新定位
- Mongodb主从复制/ 副本集/分片集群介绍
- Paul-Adrien Menez:互联网与抵制食物浪费的故事
- DRBD详细解说及配置过程记录
- Servant:基于Web的IIS管理工具
- Web前端知识体系精简——CSS 篇
- 几种异步操作方式
- 今天的面试小记
- objective-C中的序列化(serialize)与反序列化(deserialize)
- 微信小程序 template 模板功能实现循环
- ASP.NET Web API 接口执行时间监控
- 这么多前端优化点你都记得住吗?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 构建模型的3种方法
- 训练模型的3种方法
- 干货 | 携程APP/Web功能和视觉测试平台-Watcher
- FPGA中的亚稳态
- 蜂鸟E203系列——定时器中断设计
- FPGA信号截位策略
- 数字IC设计经典笔试题之【verilog篇】
- 蜂鸟E203系列——Windows下运行hello world例程
- 蜂鸟E203系列——Windows开发工具
- FPGA奇数分频
- 形式化分析工具:在虚拟操作系统和主机操作系统之间配置共享文件夹
- 「PHP」以nginx、php-cgi为例,把nginx、php-cgi安装为Windows系统服务
- 气象编程 | Bash拍了拍你说:掌握了我,工作效率起码提高5倍
- 优雅的使用Go进行单元测试
- 雷达LFM信号分析