C语言数据结构基础学习笔记——图
图(G)由顶点集(V)和边集(E)组成,G=(V,E)
常用概念:
①V(G)表示图G中顶点的有限非空集,V永不为空;
②用|V|表示图G中顶点的个数,也称为图G的阶;
③E(G)表示图G中顶点之间关系(边)的集合;
④用|E|表示图G中边的条数。
图分为:
①有向图:有向边(弧)的有限集合<V,W>;
②无向图:无向边(边)的有限集合(V,W)。
简单图:不存在顶点到自身的边,同一条边不重复出现。
多重图:某两个结点之间的边数多于一条,又允许顶点通过一条边和自己关联。
完全图:任意两个结点之间都有边,其分为:
①无向完全图:如果任意两个顶点之间都有边,其有n个结点,n*(n-1)/2条边;
②有向完全图:如果任意两个顶点之间都存在方向相反的两条弧,其有n个结点,n*(n-1)条边。
子图:若G=(V,E),G'=(V',E'),其中V'为V的子集,E'为E的子集,若V(G')=V(G),则G'为G的子图。
连通图:图中任意两个顶点都是连通的。
连通分量:无向图中的极大连通子图,有以下特点:①子图;②连通;③顶点足够多;④包含这些依附在顶点的所有边。
强连通:顶点V到顶点W和顶点W到顶点V都有路径。
强连通图:图中任意一对顶点都是强连通的。
强连通分量:有向图中的极大强连通子图,有以下特点:①子图;②强连通;③顶点足够多;④包含这些依附在顶点的所有弧。
度:以该顶点为一个端点的边数目。
在无向图中:顶点V的度是依附于该顶点的边条数,记为TD;
在有向图中:①入度:以顶点V为终点的有向边的条数,记为ID;
②出度:以顶点V为起点的有向边的条数,记为OD。
图的存储结构有以下几种:
①图的顺序存储结构:邻接矩阵,其顶点用一位数组来存储,边或弧用二维数组来存储,例如a[i][j]=1表示(vi,vj)或<vi,vj>是图的边。
#define MaxVertexNum 100 //顶点数目最大值
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //整数表示权值或者连通性
typedef struct{
VertexType Vex[MaxVertexNum]; //顶点表
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表
int vexnum,arcnum; //图的当前顶点数和弧度
}MGraph;
②图的链式存储结构:邻接表,由顶点表和边表(单链表)组成,无法遍历,只有出弧。
#define MaxVertexNum 100
typedef struct VNode{ //顶点表结点
VertexType data; //顶点表信息
ArcNode *firstedge; //单链表头指针
}VNode,AdjList[MaxVertexNum];
typedef struct ArcNode{ //边表结点
int adjvex; //该弧所指向顶点的位置
struct ArcNode *next; //指向下一条弧的指针
}ArcNode;
typedef struct{
AdjList vertices; //邻接表
int vexnum,arcnum; //图的顶点数和弧数
}ALGraph; //以邻接表存储的图类型
③有向图的优化链式存储结构:十字链表
#define MaxVertexNum 100
typedef struct VNode{
VertexType data; //顶点数据
ArcNode *first,*firstout; //该顶点的入边表头指针和出边表头指针
}VNode;
typedef struct ArcNode{
int tailvex,headvex; //这条弧的起点所在顶点表下标和终点所在顶点表下标
struct ArcNode *hlink,*tlink; //终点相同的下一条弧以及起点相同的下一条弧
}ArcNode;
typedef struct{
VNode xlist[MaxVertexNum]; //顶点依旧用顺序存储
int vexnum,arcnum; //图的顶点数与弧数
}GLGraph; //十字链表存储的图类型
④无向图的优化链式存储结构:邻接多重表
#define MaxVertexNum 100
typedef struct VNode{ //顶点表结点
VertexType data; //顶点表信息
ArcNode *firstedge; //单链表头指针
}VNode;
typedef struct ArcNode{ //边表结点
int ivex,jvex; //这条边依附的两个顶点在顶点表的下标
struct ArcNode *ilink,*jlink; //对应两个顶点的下一条边
}ArcNode;
typedef struct{
VNode xlist[MaxVertexNum];
int vexnum,arcnum; //图的顶点数和弧数
}DLGraph;
图的遍历:因为图的顶点没有特殊性,所以可以设置一个访问数组,记录遍历过程中访问过的顶点。
广度优先遍历(BFS):类似于树中的层序遍历算法。
#define MaxSize 100
bool visited[MaxSize];
void BFS(Graph G,int v){
ArcNode *p; //工作指针p
InitQueue(Q); //初始化第一个队列
visit(v); //访问第一个顶点v
visited[v]=true; //对v做已访问标记
Enqueue(Q,v); //顶点v入队列
while(!isEmpty(Q)){ //只要队列不空
DeQueue(Q,v); //顶点v出队列
p=G->adjlist[v].firstedge; //指针p指向当前顶点的边表链表头指针
while(p){
if(!visited[p->adjvex]){ //p所指向顶点如果未被访问
visit(p->adjvex); //访问p所指向的顶点
visited[p->adjvex]=true; //对这个顶点做已访问标记
EnQueue(Q,p->adjvex); //这个顶点入队列
}
p=p->next; //p指向该顶点的下一条边
}
}
}
void BFSTraverse(Graph G){
int i; //单独定义是方便多个循环使用
for(i=;i<G->vexnum;i++) visited[i]=false; //将标志数组初始化(全局数组)
for(i=;i<G->vexnum;i++){
if(!visited[i]) BFS(G,i); //为避免非连通图一些顶点访问不到,若是连通图只会执行一次
}
}
BFS的应用:解决单源非带权图最短路径问题。
深度优先遍历(DFS):类似于树的先序遍历算法。
#define MaxSize 100
bool visited[MaxSize];
void DFS(Graph G,int v){
ArcNode *p;
visit(v);
visited[v]=true;
p=G->adjlist[v].firstarc;
while(p!=NULL){
if(!visited[p->adjvex]){
DFS(G,p->adjvex);
}
p=p->nextarc;
}
}
void DFSTraverse(Graph G){
int i;
for(i=;i<G->vexnum;i++) visited[i]=false; //将标志数组初始化(全局数组)
for(i=;i<G->vexnum;i++){
if(!visited[i]) DFS(G,i);
}
}
C语言数据结构基础学习笔记——图的更多相关文章
- C语言数据结构基础学习笔记——C语言基础
抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示抽象数据类型. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合, ...
- C语言数据结构基础学习笔记——B树
2-3树:是一种多路查找树,包含2结点和3结点两种结点,其所有叶子结点都在同一层次. 2结点:包含一个关键字和两个孩子(或没有孩子),其左孩子的值小于该结点,右孩子的值大于该结点. 3结点:包含两个关 ...
- C语言数据结构基础学习笔记——树
树是一种一对多的逻辑结构,树的子树之间没有关系. 度:结点拥有的子树数量. 树的度:树中所有结点的度的最大值. 结点的深度:从根开始,自顶向下计数. 结点的高度:从叶结点开始,自底向上计数. 树的性质 ...
- C语言数据结构基础学习笔记——栈和队列
之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...
- C语言数据结构基础学习笔记——动态查找表
动态查找表包括二叉排序树和二叉平衡树. 二叉排序树:也叫二叉搜索树,它或是一颗空树,或是具有以下性质的二叉树: ①若左子树不空,则左子树上所有结点的值均小于它的根结点的值: ②若右子树不空,则右子树上 ...
- C语言数据结构基础学习笔记——静态查找表
查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找. 查找表:用于查找的数据集合称为查找表,一般有以下操作:①查找是否在表中:②查找属性:③进行操作. 查找表又分为: ①静态查找表:只可以进行 ...
- C语言数据结构基础学习笔记——基础线性表
线性表是指具有相同数据类型的n(n>=0)个数据元素的有限序列,它具有一个表头元素和一个表尾元素,并且每一个数据元素最多只有一个直接前驱和一个直接后继. 线性表的顺序存储也叫作顺序表,它的特性是 ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- R语言与机器学习学习笔记
人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自 ...
随机推荐
- UVa——1600(巡逻机器人)
迷宫求最短路的话一般用bfs都可以解决,但是这个加了个状态,那么就增加一个维度,用来判断k的值.比较简单的三维bfs.写搜索题的话一定要注意细节.这个题花了好长的时间.因为k的原因,一开始用了k的原因 ...
- Java基于opencv实现图像数字识别(五)—腐蚀、膨胀处理
腐蚀:去除图像表面像素,将图像逐步缩小,以达到消去点状图像的效果:作用就是将图像边缘的毛刺剔除掉 膨胀:将图像表面不断扩散以达到去除小孔的效果:作用就是将目标的边缘或者是内部的坑填掉 使用相同次数的腐 ...
- 部署springboot工程到linux上及遇到的坑
一.步骤 1.将工程打成jar包 IDEA中点击file-project structure,如下图: 选择Artifacts-JAR-From modules,选择入口类Main Class,如下图 ...
- less--入门
Less(Learner Style Sheets)是向后兼容css扩展语言. 变量(Variables) @width: 10px; @height: @width + 10px; header{ ...
- load data local to table
步骤: 1.使用show语句查找服务器上当前存在的数据库: 2.如果数据库存在,尝试访问它,之后创建表(我这里是之前创建的,所以就直接show tables) 3.将本地文件加载到表中,创建一个文本文 ...
- iOS launchImage
iOS launchImage https://stackoverflow.com/questions/34027270/ios-launch-screen-in-react-native 如何设置: ...
- cin.ignore
功能:函数用于输入流.它读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF).其调用形式为cin.ignore(n,终止字符) 原型:istrea ...
- 17. Debuggers (调试器 5个)
反编译是安全研究的重要组成部分. 它将帮助您解剖Microsoft补丁,以发现他们无法告诉您的默认修复的错误,或更仔细地检查服务器二进制文件以确定为什么您的漏洞利用不起作用. 许多调试器都可用,但ID ...
- EBS WEBADI无法创建文档
有些小伙伴在使用WEBADI时,下载模板之后会发现模板创建文档一直没有成功(没有报错,只是单纯的没有创建出文档),可以参考: http://blog.csdn.net/cyco008/article/ ...
- 在经过身份验证的服务中不支持跨域 javascript 回调
在 asp.net web forms 站点中做了一个 wcf restful service 接口,开启了webforms 身份认证. 当 webforms 站点用户登录之后,访问 restful ...