图的概念、存储和遍历
一、图的定义
单从字面上来看,我们可能会理解为图片,比如:
不好意思放错图了。这些图片都是由千千万万个像素点组成,和我们今天学的图不一样。
其实,图不只有点,它还由一些连接两个点的边组成。所以,点用边连起来就叫图。若我们把图记为 G G G,把点记为 V V V,把边记为 E E E,则 G = ( V , E ) G=(V,E) G=(V,E)。
二、基本概念
1. 图的分类
对于一条边 k k k,它肯定连接了两个点 i i i 和 j j j。生活中,我们把点 i i i 和 j j j 看作两个城市,边看成 i i i 和 j j j 中间的道路 k k k。那么 i i i 可以通过 k k k 到达 j j j,同理, j j j 也能通过 k k k 到达 i i i。对于这样双向连接的图,称为无向图。
不同于现实,在另一种图中,每条边都有了方向。即,指定只能从 i i i 到 j j j 而不能从 j j j 到 i i i,这就是有向图。
当一个图里面的边很多时,我们会直观地认为这个图很密、满,称作稠密图。相反,若边很少,则称作稀疏图。
特殊的,若一个图的边已经连完,即对于任意 1 ≤ i , j ≤ n 1 \leq i,j \leq n 1≤i,j≤n, i i i 和 j j j 都有边相连。这样的图称作完全图。对于有向图,每个点都要与除自己以外的 n − 1 n-1 n−1 个点相连,故共有 n ( n − 1 ) n(n-1) n(n−1) 个点。而对于无向图,因为有向图中毎两个点之间要连两条边,而无向图只需要一条,是有向图的一半,所以共有 n ( n − 1 ) 2 \frac {n(n-1)} 2 2n(n−1) 个点。
对于有向图,有一种情况需要考虑:从一个点出发,经过一系列遍历后,最终可以回到该点。对于起点和终点相同的路径,我们称这是一个环,又称回路。所以,有向无环图横空出世(虽然我也不知道为什么),很多题都与它相关。只不过,有些题会说成它的另一种名称:DAG。
2. 点和边
接下来就是一些很死的定义:
点的度:与该点相连的边的数量。
在有向图中,起点为该点的边数称作该点的出度。相反,终点为该点的边数称作该点的入度。
权值:边的费用。可以理解成边的长度。
连通:若点 i i i 和 j j j 相连,即有一条通路可以从 i i i 到达 j j j,则称 i i i 和 j j j 是连通的。但 j j j 和 i i i 不一定是连通的。
自环:若边 k k k 连接了点 i i i 和 i i i 自己,则称 k k k 为自环。在许多题目中,往往要对自环进行处理。 因为它没有意义,但却会影响程序。
三、存储
1.邻接矩阵
定义一个二维数组 G i , j G_{i,j} Gi,j。其中, i i i 和 j j j 表示任意两点。
- 无权值。若 i i i 和 j j j 之间有边,则 G i , j = 1 G_{i,j}=1 Gi,j=1。否则 G i , j = 0 G_{i,j}=0 Gi,j=0
- 有权值。若 i i i 和 j j j 之间有边,则 G i , j = w G_{i,j}=w Gi,j=w( w w w 为权值)。否则, G i , j = + ∞ G_{i,j}=+\infty Gi,j=+∞
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现