数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

摘自:数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)
作者:正弦定理
发布时间:2020-12-19 17:25:49
网址:https://blog.csdn.net/zhuguanlin121/article/details/118436142

无向图创建邻接矩阵、深度优先遍历和广度优先遍历

  • 一、概念解析:
    • (1)无向图:
    • (2)邻接矩阵:
  • 二、创建邻接矩阵:
  • 三、深度遍历、广度遍历
    • (1)深度遍历概念:
    • (2)广度遍历概念:
  • 四、实例展示

一、概念解析:

(1)无向图:

假设图G由两个集合V和E组成,记为G={V , E}。其中V是顶点的有限集合,E是连接V中两个不同顶点的边的有限集合。如果E中的顶点对是有序的,即E中的每条边都是有方向的,则称G是有向图。如果顶点对是无序的,则称G是无向图

在这里插入图片描述

在这里插入图片描述

(2)邻接矩阵:

邻接矩阵主要由:二维数组 实现

如图
在这里插入图片描述

转换成邻接矩阵为:

在这里插入图片描述

二、创建邻接矩阵:

基本每一步都有注释,详细观看,建议画图理解

代码如下:

#define MAXSIZE 100 
//	邻接矩阵 
typedef struct Matrix{int V_Data;		//	顶点数据域 int E_Data;		//	边数数据域int Node[MAXSIZE];	//	存放顶点数据,也就是顶点表 int Weight[MAXSIZE][MAXSIZE]; 	//	存放权重,为矩阵中两点有边的标记符号 }MaTrix,*MATRIX;//	邻接矩阵数据结构体 
typedef struct Edge{int v1;		//	用来存放第一个顶点 int v2;		//	用来存放第二个顶点int weight;	//	用来存放两点之间的标记符,即为权 
}*EDGE;//******************** 邻接矩阵*******************//
//	邻接矩阵、顶点和边初始化 
void Init_Matrix(MATRIX S,int Vertex)
{	S->E_Data = 0;			//	初始化为0条边 S->V_Data = Vertex;		//	初始化顶点数 int i,j;for(i=0;i<Vertex;i++){for(j=0;j<Vertex;j++){S->Weight[i][j] = 0;}} 
}//	开始插入边的权重,即为两个顶点之间边的标记符
void InSerData(MATRIX S,EDGE E)
{//	将输入的顶点v1、v2之间的边,用权作为标记,在矩阵中表示//	这里是无向图,所以边没有方向,需要做标记两次(为v1-v2和v2-v1) S->Weight[E->v1][E->v2] = E->weight;	 S->Weight[E->v2][E->v1] = E->weight; 
} //	开始插入数据 
void InSerEdge_Data(MATRIX S,int edge,int V)
{int i,j;if(edge>0)	//	边数大于0的时候才插入数据 {printf("请输入顶点和权重(空格分隔!)\n");for(i=0;i<edge;i++){		EDGE E;				//分配内存,接受顶点v1,v2和权重(标记符)	E = (EDGE)malloc(sizeof(struct Edge));	scanf("%d %d %d",&(E->v1),&(E->v2),&(E->weight));if(E->v1 ==E->v2){printf("无向图邻接矩阵对角线为0,输入错误,结束运行\n");exit(-1); }InSerData(S,E);}	printf("请输入要定义的顶点,填入顶点表中: \n");for(j=0;j<V;j++){scanf("%d",&(S->Node[j]));}}else{	printf("输入的边数错误"); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

三、深度遍历、广度遍历

(1)深度遍历概念:

在这里插入图片描述

在这里插入图片描述

定义的结构体、数组可看上面代码

深度遍历代码解析:

//*****************	深度优先遍历算法—邻接矩阵 *****************//
void DFS_Begin(MATRIX P,int k,int V)
{int i;flag[k] = 1;	//标记当前顶点,表示已经遍历过printf("%d ",P->Node[k]);	//	输出当前顶点 for(i=0;i<V;i++){if(!flag[i] && P->Weight[k][i] != 0)//	如果当前顶点的邻近点存在,且没有遍历过 {									//	则继续递归遍历 DFS_Begin(P,i,V);		//	递归遍历当前顶点的邻近点 }	} 
}void Init_DFSMatrix(MATRIX P,int V)
{int i;//	初始化标记符数组,全为0 for(i=0;i<V;i++){flag[i] = 0;}for(i=0;i<V;i++)	//	每个顶点都要检查是否遍历到 {if(!flag[i])	//	排除遇到已经遍历的顶点DFS_Begin(P,i,V);		//	开始深度遍历	} putchar('\n');}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

(2)广度遍历概念:

在这里插入图片描述

这里使用到了链队列(也可以使用数组队列,看个人想法),可以看我之前的博文有讲:

//******************** 队列 *****************//
typedef struct Queue{int data[MAXSIZE];	//	队列大小 int head;	//	队头 int wei;	//	队尾 }Queue; //*****************	队列 *************************************//
//	队列初始化 
void InitQueue(Queue *q)
{q->head= 0;		//	初始化队头、队尾 q->wei = 0;
} //	判断队列是否为空
int EmptyQueue(Queue *q)
{if(q->head == q->wei)return 1;else{return 0;}		
} //	入队
void PushQueue(Queue *q,int t)
{if((q->wei+1)%MAXSIZE == q->head)	//	说明队列已经满了return;else{	q->data[q->wei] = t;	q->wei = (q->wei +1)%MAXSIZE;	//	队尾后移 }} //	出队
void PopQueue(Queue *q,int *x)
{if(q->wei == q->head)	//	出队完毕 return;	else{	 	*x = q->data[q->head];q->head = (q->head + 1)%MAXSIZE; //	队头后移	}	} //***************** 广度优先搜索算法—邻接矩阵 ****************//
void Init_Bfs(MATRIX S,int V)
{int i,j;int k;Queue Q;for(i=0;i<V;i++){Vist[i] = 0;	//	初始化标记符 }InitQueue(&Q);	//	队列初始化 for (i = 0; i < V; i++){if (!Vist[i])	//	判断以这个顶点为基准,有连接的其他顶点 {Vist[i] = 1;	//	标记遍历的这个顶点 printf("%d ", S->Node[i]);PushQueue(&Q, i);	//	入队 while (!EmptyQueue(&Q))	//	队列中还有数据,说明这个顶点连接的其他顶点还没有遍历完 {PopQueue(&Q,&i);	//	出队 for (j = 0; j < V; j++){//	以这个顶点为基准,遍历其他连接的顶点 if (!Vist[j] && S->Weight[i][j] != 0){Vist[j] = 1;	//	与之连接的顶点作上标记,便于后序顶点跳过相同的遍历 printf("%d ", S->Node[j]);//	输出与之相邻连接的顶点 PushQueue(&Q, j);	//	让与之连接的顶点其位置入队 }}}}}
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

四、实例展示

注意:这里存入数据时,坐标点以原点(0,0)为起点开始!

以这个图为样例展示:

在这里插入图片描述

全部代码:

#include<stdio.h>
#include<stdlib.h>#define MAXSIZE 100 //	深度遍历标记符
int flag[MAXSIZE]; 		//	邻接矩阵 //	广度优先遍历标记符 
int Vist[MAXSIZE]; 		//	邻接矩阵//******************** 队列 *****************//
typedef struct Queue{int data[MAXSIZE];	//	队列大小 int head;	//	队头 int wei;	//	队尾 }Queue; //	邻接矩阵 
typedef struct Matrix{int V_Data;		//	顶点数据域 int E_Data;		//	边数数据域int Node[MAXSIZE];	//	存放顶点数据,也就是顶点表 int Weight[MAXSIZE][MAXSIZE]; 	//	存放权重,为矩阵中两点有边的标记符号 }MaTrix,*MATRIX;//	邻接矩阵数据结构体 
typedef struct Edge{int v1;		//	用来存放第一个顶点 int v2;		//	用来存放第二个顶点int weight;	//	用来存放两点之间的标记符,即为权 
}*EDGE;//******************** 邻接矩阵*******************//
//	邻接矩阵、顶点和边初始化 
void Init_Matrix(MATRIX S,int Vertex)
{	S->E_Data = 0;			//	初始化为0条边 S->V_Data = Vertex;		//	初始化顶点数 int i,j;for(i=0;i<Vertex;i++){for(j=0;j<Vertex;j++){S->Weight[i][j] = 0;}} 
}//	开始插入边的权重,即为两个顶点之间边的标记符
void InSerData(MATRIX S,EDGE E)
{//	将输入的顶点v1、v2之间的边,用权作为标记,在矩阵中表示//	这里是无向图,所以边没有方向,需要做标记两次(为v1-v2和v2-v1) S->Weight[E->v1][E->v2] = E->weight;S->Weight[E->v2][E->v1] = E->weight; 
} //*****************	深度优先遍历算法—邻接矩阵 *****************//
void DFS_Begin(MATRIX P,int k,int V)
{int i;flag[k] = 1;	//标记当前顶点,表示已经遍历过printf("%d ",P->Node[k]);	//	输出当前顶点 for(i=0;i<V;i++){if(!flag[i] && P->Weight[k][i] != 0)//	如果当前顶点的邻近点存在,且没有遍历过 {									//	则继续递归遍历 DFS_Begin(P,i,V);		//	递归遍历当前顶点的邻近点 }	} 
}void Init_DFSMatrix(MATRIX P,int V)
{int i;//	初始化标记符数组,全为0 for(i=0;i<V;i++){flag[i] = 0;}for(i=0;i<V;i++)	//	每个顶点都要检查是否遍历到 {if(!flag[i])	//	排除遇到已经遍历的顶点DFS_Begin(P,i,V);		//	开始深度遍历	} putchar('\n');}//*****************	队列 *************************************//
//	队列初始化 
void InitQueue(Queue *q)
{q->head= 0;		//	初始化队头、队尾 q->wei = 0;
} //	判断队列是否为空
int EmptyQueue(Queue *q)
{if(q->head == q->wei)return 1;else{return 0;}		
} //	入队
void PushQueue(Queue *q,int t)
{if((q->wei+1)%MAXSIZE == q->head)	//	说明队列已经满了return;else{	q->data[q->wei] = t;	q->wei = (q->wei +1)%MAXSIZE;	//	队尾后移 }} //	出队
void PopQueue(Queue *q,int *x)
{if(q->wei == q->head)	//	出队完毕 return;	else{*x = q->data[q->head];q->head = (q->head + 1)%MAXSIZE; //	队头后移}	} //***************** 广度优先搜索算法—邻接矩阵 ****************//
void Init_Bfs(MATRIX S,int V)
{int i,j;int k;Queue Q;for(i=0;i<V;i++){Vist[i] = 0;	//	初始化标记符 }InitQueue(&Q);	//	队列初始化 for (i = 0; i < V; i++){if (!Vist[i])	//	判断以这个顶点为基准,有连接的其他顶点 {Vist[i] = 1;	//	标记遍历的这个顶点 printf("%d ", S->Node[i]);PushQueue(&Q, i);	//	入队 while (!EmptyQueue(&Q))	//	队列中还有数据,说明这个顶点连接的其他顶点还没有遍历完 {PopQueue(&Q,&i);	//	出队 for (j = 0; j < V; j++){//	以这个顶点为基准,遍历其他连接的顶点 if (!Vist[j] && S->Weight[i][j] != 0){Vist[j] = 1;	//	与之连接的顶点作上标记,便于后序顶点跳过相同的遍历 printf("%d ", S->Node[j]);//	输出与之相邻连接的顶点 PushQueue(&Q, j);	//	让与之连接的顶点其位置入队 }}}}}
} //	初始化顶点个数 
int Init_Vertex()
{int Vertex;printf("请输入顶点个数: ");scanf("%d",&Vertex);return Vertex;
}//	初始化边的数量 
int Init_Edge()
{int edge;printf("请输入边的数量: ");scanf("%d",&edge);return edge;} //	开始插入数据 
void InSerEdge_Data(MATRIX S,int edge,int V)
{int i,j;if(edge>0)	//	边数大于0的时候才插入数据 {printf("请输入顶点和权重(空格分隔!)\n");for(i=0;i<edge;i++){		EDGE E;				//分配内存,接受顶点v1,v2和权重(标记符)	E = (EDGE)malloc(sizeof(struct Edge));	scanf("%d %d %d",&(E->v1),&(E->v2),&(E->weight));if(E->v1 ==E->v2){printf("无向图邻接矩阵对角线为0,输入错误,结束运行\n");exit(-1); }InSerData(S,E);}	printf("请输入要定义的顶点,填入顶点表中: \n");for(j=0;j<V;j++){scanf("%d",&(S->Node[j]));}}else{printf("输入的边数错误"); } } 
//	打印无向图邻接矩阵 
void Show_Matrix(MATRIX p,int Vertex)
{int i,j;for(i=0;i<Vertex;i++){for(j=0;j<Vertex;j++){printf("%4d",p->Weight[i][j]);	//	打印邻接矩阵 }	putchar('\n');	//	换行 }
}int main()
{int val;int Vertex;int edge;MATRIX p;		//	邻接矩阵头节点指针//	创建无向图邻接矩阵 					Vertex = Init_Vertex();edge = Init_Edge();p = (MATRIX)malloc(sizeof(MaTrix));		//分配内存空间 p->V_Data = Vertex;		//	记录顶点个数 p->E_Data = edge;		//	记录边的个数 Init_Matrix(p,Vertex);	//	初始化邻接矩阵 InSerEdge_Data(p,edge,Vertex);	//	插入数据 //	打印无向图的邻接矩阵 printf("无向图邻接矩阵如下:");	printf("\n----------------------------------\n\n");Show_Matrix(p,Vertex);printf("\n----------------------------------\n");//	深度优先遍历—邻接矩阵	printf("深度遍历—邻接矩阵结果为:\n");Init_DFSMatrix(p,Vertex);//	广度优先遍历—邻接矩阵printf("广度优先遍历—邻接矩阵结果为: \n");Init_Bfs(p,Vertex);return 0;	
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303

结果图:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 图片识别白色区域进行裁剪_【研途技能贴】| 4款好用的图片处理软件推荐...

要考研啦4款好用的图片处理软件推荐01入门级作图神器——图怪兽一款会打字就能用的在线编辑器&#xff0c;80万模板任君挑选~无论是基础的旋转裁剪&#xff0c;还是难度进阶的抠图拼图&#xff0c;在这款软件里&#xff0c;你可以分分钟做出高大上的好图&#xff01;Use tips①…

Android 开发(一)项目概况

2019独角兽企业重金招聘Python工程师标准>>> 开始写博客&#xff0c;自己是边学习边做开发&#xff0c;将自己开发的过程记录下来&#xff0c;能够对学习的知识进行梳理&#xff0c;也可以对学习做个总结。 首先是对项目的介绍&#xff1a; 做一个功能全面的软件&am…

github和dockerhub制作k8s镜像

一、前言&#xff1a; 对于初学者来说&#xff0c;k8s的镜像问题往往会将他们拦在学习门外&#xff0c;今天就白话一下k8s众多镜像的获取方式&#xff0c;前提只有一个&#xff1a;你能上百度。 二、github和dockerhub账号准备&#xff0c;这个没任何门槛&#xff0c;只要知道这…

数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

摘自&#xff1a;数据结构——无向图创建邻接表以及深度遍历、广度遍历&#xff08;C语言版&#xff09; 作者&#xff1a;正弦定理 发布时间&#xff1a;2020-12-22 20:55:12 网址&#xff1a;https://blog.csdn.net/chinesekobe/article/details/111409503 数据结构——无向图…

C++轮子队-第三周(需求改进原型设计)

需求改进&原型设计 一.需求完善 &#xff08;一&#xff09;系统功能&#xff08;补充&#xff09; 图形界面&#xff08;图片如下图所示&#xff1a;&#xff09; 根据需求与组内讨论结果&#xff0c;现归纳图形界面方面需要的设计与相应功能&#xff1a; 数据-图形界面中…

Linux 从头学 01:CPU 是如何执行一条指令的?

摘自&#xff1a;Linux 从头学 01&#xff1a;CPU 是如何执行一条指令的&#xff1f; 作者&#xff1a;IOT物联网小镇 发布时间&#xff1a;2021-07-02 08:22:43 网址&#xff1a;https://blog.csdn.net/jchen1218/article/details/118404217?utm_sourceapp&app_version4.…

积极拥抱.NET Core开源社区

潘正磊在上海的Tech Summit 2018 大会上给我们的.NET Core以及开源情况带来了最新信息。 .Net Core 开源后取得了更加快速的发展&#xff0c;目前越活跃用户高达400万人&#xff0c;每月新增开发者45万&#xff0c;在 GitHub 上的月度增长达到15%。目前有来自超过3,700家企业的…

内存:你跑慢点行不行?CPU:跑慢点你养我吗?内存:我不管!(内附超全思维导图)

摘自&#xff1a;内存&#xff1a;你跑慢点行不行&#xff1f;CPU&#xff1a;跑慢点你养我吗&#xff1f;内存&#xff1a;我不管&#xff01;&#xff08;内附超全思维导图&#xff09; 作者&#xff1a;程序员cxuan 发布时间&#xff1a;2020-03-09 13:43:11 网址&#xff1…

过期时间_2020年最新航空里程过期时间及避免过期方法总结

【2020.2 更新】近几年来主要有如下变化&#xff1a;UA 里程永不过期了&#xff0c;Southwest 里程永不过期了&#xff0c;Asia Miles 里程可以通过里程变动续命了&#xff0c;Flying Blue 里程变成24个月过期了&#xff0c;AV 里程变成12个月过期了。各大航空的里程过期政策辛…

Spring Boot 5:应用程序启动时初始化资源

需求&#xff1a;应用程序启动后&#xff0c;初始化基础数据、加密证书等操作。 可以使用CommandLineRunner接口来实现&#xff0c;在SpringBoot.run()之后完成资源的初始化工作。 注意&#xff1a;多个Runner需要顺序启动的话&#xff0c;可以使用Order注解 package sun.flowe…

中的 终端报错怎么看原因_《琅琊榜》中太子被封禁,高湛引皇上看桂花的真正原因是什么?...

《琅琊榜》中&#xff0c;高湛是一个非常经典的角色&#xff0c;他比夏江更懂梁帝的心&#xff0c;或者说&#xff0c;知梁帝者&#xff0c;莫过于高湛。当然&#xff0c;若不是如此&#xff0c;高湛也不能在梁帝身边待了那么些年。梁帝生病&#xff0c;喝下静妃娘娘配制的甜汤…

STM32安装Keil5、芯片支持包、startup启动文件(启动过程、冷热启动)、建立工程、ST-LINK烧写步骤

参考&#xff1a;stm32入门之keil5的安装以及第一个工程的建立 作者&#xff1a;SKY丶丿平才 发布时间&#xff1a; 2020-12-06 17:08:30 网址&#xff1a;https://blog.csdn.net/weixin_48264057/article/details/110734596 目录使用的STM32F103C8T6一、Keil5的下载与安装1.下…

深度学习都是非凸问题_神经网络的损失函数为什么是非凸的?

Ian Goodfellow曾经给在quora回答过&#xff0c;以下是原文&#xff1a;There are various ways to test for convexity.One is to just plot a cross-section of the function and look at it. If it has a non-convex shape, you don’t need to write a proof; you have dis…

针对移动互联网应用的网络建设和优化

为什么80%的码农都做不了架构师&#xff1f;>>> 针对移动互联网应用的网络建设和优化 截至2013年3月,移动互联网的人均上网时长和PC互联网相比差距已经扩大了29%.PC互联网向移动端迁移的趋势进一步凸显.小米是一家专注于iPhone和Android等新一代智能手机软件…

STM32F103实现点灯(寄存器方式)

参考&#xff1a;STM32F103系列最简易版点灯程序 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-10-21 11:40:38 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109196950 目录硬件软件点灯流程使能GPIO端口E和B对应的时钟找到GPIO对应的时钟…

rocketmq 消费方式_RocketMQ事务消费和顺序消费详解

一、RocketMq有3中消息类型1.普通消费2. 顺序消费3.事务消费顺序消费场景在网购的时候&#xff0c;我们需要下单&#xff0c;那么下单需要假如有三个顺序&#xff0c;第一、创建订单 &#xff0c;第二&#xff1a;订单付款&#xff0c;第三&#xff1a;订单完成。也就是这个三个…

GPIO输入输出模式原理(八种工作方式附电路图详解)

这几篇博文讲的不错&#xff0c;可参照着理解&#xff1a; STM32下拉输入模式与振动传感器的使用 “上拉电阻与下拉电阻”通俗解读 上、下拉电阻&#xff08;定义、强弱上拉、常见作用、吸电流、拉电流、灌电流&#xff09; 个人总结&#xff1a; 模拟量选浮空输入&#xff0c…

STM32F103构建固件库模板(PS固件库文件树介绍)

参考&#xff1a;STM32F103ZE新建固件库模板 作者&#xff1a;追兮兮 发布时间&#xff1a;2020-10-14 10:31:45 网址&#xff1a;https://blog.csdn.net/weixin_44234294/article/details/109065495 参考博文&#xff1a;https://blog.csdn.net/visual_eagle/article/details/…

STM32F103实现点灯(固件库方式)

参考&#xff1a;stm32上实现点灯 作者&#xff1a;SKY丶丿平才 发布时间&#xff1a; 2021-03-20 16:51:06 网址&#xff1a;https://blog.csdn.net/weixin_48264057/article/details/115028724 目录前言一、硬件设计二、软件设计1.建立工程2.代码编写三、实际验证1.烧写程序2…

STM32震动感应控制继电器(使用循环VS使用外部中断EXTI和中断控制器NVIC)

参考&#xff1a;stm32的外部中断 震动感应 控制 继电器 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-05 22:37:01 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114417161 参考&#xff1a;STM32震动感应灯 作者&#xff1a;一只小阿大…