数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(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 数据结构——无向图…

python抽象类的实现_python 抽象类、抽象方法的实现

由于python 没有抽象类、接口的概念&#xff0c;所以要实现这种功能得abc.py 这个类库,具体方式如下from abc import ABCMeta, abstractmethod#抽象类class Headers(object):__metaclass__ ABCMetadef __init__(self):self.headers abstractmethoddef _getBaiduHeaders(self)…

全文检索技术介绍与使用方法

全文检索技术ElasitcSearch介绍&#xff1a;http://www.javacodegeeks.com/2013/04/getting-started-with-elasticsearch.html全文检索技术Elasticsearch的使用介绍&#xff1a;http://www.cnblogs.com/dennisit/archive/2013/04/08/3008631.htmlIBM职员对ElasticSearch的认识&…

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.…

python题目推荐_python题目

#1~100的奇数和&#xff0c;偶数和sum 0n 99while n > 0:sum sum nn n - 2print(sum)i1sum0while i<100:if i%20:sumii1else:i1print(sum)#偶数sum0for i in range(1,101):if i%20:sumiprint(sum)#奇数sum10for i in range(1,101):if i%2!0:sum1iprint(sum1)print(s…

两个主机通信过程

主机A与主机B通信,A Ping B,图:A-交换机-B,AB同一子网(1)ping数据包用的是ICMP协议&#xff0c;IP协议的一个子协议&#xff0c;位于三层&#xff0c;包含A的IP&#xff0c;B的IP,三层进行IP封装成包,进入二层(2)A,B处于相同子网,查看缓存中对与目的对应得B第2层mac地址,如果存…

积极拥抱.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…

怎么用python读取大文件_使用Python读取大文件的方法

背景准备试一试:f 开放(\u201C\/道路\/ \/文件\u201D,\u201Cr\u201D)打印()最后:如果f:()调用读()将读取所有文件的内容,如果文件有10 g,记忆会破灭,所以,为了安全起见,你可以反复调用read(大小)方法,每次最多读字节大小。此外,调用readline()一次读取一行,叫readline()阅读所有…

#10172. 「一本通 5.4 练习 1」涂抹果酱 题解

题目链接 一道三进制状压的好题。 题目描述: Tyvj 两周年庆典要到了&#xff0c;Sam 想为 Tyvj 做一个大蛋糕。蛋糕俯视图是一个 NM的矩形&#xff0c;它被划分成 NM个边长为 11的小正方形区域&#xff08;可以把蛋糕当成 N 行 M 列的矩阵&#xff09;。蛋糕很快做好了&#x…

全国计算机等级考试题库二级C操作题100套(第89套)

第89套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:求出形参ss所指字符串数组中最长字符串的 长度&#xff0c;其余字符串左边用字符*补齐,使其与最长的字符串等长。字符串数组中共 有M个字符串&#xff0c;且串长<N。 请在程序的下划线处填入正确的内容并把下划线…

Android 调用相册 拍照 实现系统控件缩放 切割图片

android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家。 package cn.m15.test;import java.io.ByteArrayOutputStream; import java.io.File; import android.app.Activity; import android.content.Intent; import a…

全国计算机等级考试题库二级C操作题100套(第88套)

第88套&#xff1a; 函数fun的功能是&#xff1a;把形参a所指数组中的最大值放在a[0]中&#xff0c;接着求出a所指数组中的最小值放在a[1]中&#xff1b;再把a所指数组元素中的次大值放在a[2]中&#xff0c;把a数组元素中的次小值放在a[3]中&#xff1b;其余以此类推。例如:若…

75: libreoj #10028 双向宽搜

$des$ 实现一个bfs $sol$ 写了一个双向bfs #include <bits/stdc.h>using namespace std;#define Rep(i, a, b) for(int i a; i < b; i )#define gc getchar() inline int read() {int x 0; char c gc;while(c < 0 || c > 9) c gc;while(c > 0 &&…