Phil的课堂笔记之数据结构——图

数据结构——图

这节课也是蹭的大佬的听的咯
先来总结一下叭
在这里插入图片描述
在这里插入图片描述

  1. 图的基本概念
  2. 图的存储结构
  3. 图的遍历 BFS、DFS
  4. 图的应用
    4.1 最小生成树 Prim、Kruskal
    4.2 最短路径 Dijkstra、Floyd
    4.3 AOV网 拓扑排序
    4.4 AOE网 关键路径

1 图的基础知识

,是一种用节点和边来表示相互关系的数学模型。

(A graph is a mathematical structure for representing relationships using nodes and edges)

【第340页 0x61节 注1】参考资料 - 图_(数学).pdf
form 大蓝书

0.0 图是由边和点组成的。

  • 有向图
    如图中的每一条边,如果有表明方向,有起点终点,这样的图我们称为有向图(Directed Graph即有方向的图)
    在这里插入图片描述

  • 无向图:如果图中的边没有方向性,那么我们就称这样的图为无向图(Undirected Graph即没有方向的图)
    在这里插入图片描述

  • 下图就是有向图跟无向图的区别
    在这里插入图片描述在这里插入图片描述

  • 完全图:完全无向图,完全有向图
    一个点和其他所有点都相连
    在这里插入图片描述

  • 无权图:(Unweighted Graph)
    在这里插入图片描述

  • 有权图
    在这里插入图片描述

  • 结点的度:无向图中,与其相连的边的个数

  • 入度:有向图中,以该点为终点的边的个数

  • 出度:有向图中,以该点为起点的边的个数

  • 边权

  • 点权

  • 稠密图

  • 稀疏图

  • 强连通图

  • 连通分量

  • 强通图分量:有向图中任意两个点都联通的最大子图

在这里插入图片描述

  • 路径(path):从某个顶点到另一个顶点之间的路径,可以用经过的点或者经过的边来表示。例如从V到Z,所经过的路径可以表示为:
    {b, h} 或者{V, X, Z}

  • 路径长度(path length):路径中包含的节点数或者边的数量

  • 邻居(neighbor):通过一条边直接相连的两个节点,称为邻居,例如图中的V和X

  • 环(cycle):路径的起点跟终点都是在同一个节点中的路径。例如(红色线条)和蓝色线条
    路径:{b, g, f, c, a} 或者 {V, X, Y, W, U, V},还有 .{c, d, a} 或者{U, W, V, U}.
    在这里插入图片描述

  • 无环图:图中不包含任何的环状的图

  • 循环(loop):连接自身顶点的边。许多图中是不允许包含有循环的
    在这里插入图片描述

  • 可达(reachable):如果存在一条路径,使得a能够到达b,就称a到b可达

  • 连通(connect):如果图中每一个顶点都能相互可达,那么我们就称这图是连通的,称为连通图
    ————————————————
    版权声明:上面一小段为CSDN博主「GDMU_redAnt」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接

2 图的存储结构

  • 包括邻接矩阵、邻接表、逆邻接表

  • 邻接矩阵:不带权图(用0、1表示)
    带权图(用权重、无穷表示);
    邻接矩阵第i行之和可求出顶点Vi的度

  • 邻接表:包含顶点表和边表,邻接表不唯一(意味着边表顺序可以不一致)

  • 逆邻接表

!如何创建一个邻接表?
我们首先要明白,图是由点和边组成的,所以我们要建立一个图,就要考虑每一条边的属性。
那么创建一个邻接表,我们考虑的边的属性有哪些呢?
边的起点,边的终点,边权;
这一条边的上一条边是哪条(想想为什么)

struct Edge{
  int st,to,nxt,w;
}edge[200005];

在这里插入图片描述
就拿这个图来说
节点1的邻居有3个,分别为节点2,3,4
我们假设输入这三条边的顺序为5,7, 9
那么按照我们正常的思路来讲应该是这样的

void add(int u,int v,int w){	//邻接表的实现程序 
  cnt++;						//边的序号 
  edge[cnt].st  = u;
  edge[cnt].to  = v;				//赋予每个边的信息 
  edge[cnt].w   = w;
  edge[cnt].nxt = ?    //不会写了
  ? =cnt;
}

我们可以发现,问号的地方缺一点东西,让这条边的上一条边是“兄弟”的那条边的(如图中9号边的上一条是7号)
这时就需要一个变量来存储每个节点现在有多少条边,就能知道这条的上一条是哪条了

void add(int u,int v,int w){	//邻接表的实现程序 
  cnt++;						//边的序号 
  edge[cnt].st  = u;
  edge[cnt].to  = v;				//赋予每个边的信息 
  edge[cnt].w   = w;
  edge[cnt].nxt = hd[u];
  hd[u]=cnt;			//实现每一条边的上一个边 
}

2 图的遍历DFS,BFS

  • BFS 广度优先搜索 Breadth First Search
  • DFS 深度优先搜索 Depth-First-Search

DFS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值