数据结构——图
这节课也是蹭的大佬的听的咯
先来总结一下叭
- 图的基本概念
- 图的存储结构
- 图的遍历 BFS、DFS
- 图的应用
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