图的概念
图表明了一种多对多的关系,图由两个元素组成,节点(vertex)和边(edge)。
- 有向图:如果给每条边规定一个方向,那么就是一个有向图。
- 入度出度:对于有向图而言,指向一个顶点的边数称为一个点的入度,从一个顶点指出的边的个数就是出度。
- 有权图:图中的边有各自的权重。
- 连通性:图的任意两个点之间都是连通的,有向图的话就是双向都是连通的,就是强连通图。连通性是图的基本性质。
- 连通分量:图的极大连通子图就是图的连通分量。
图的存储方式
- 邻接矩阵
采用的是V*V的矩阵存储,无权图的边用1和0表示,有权图用权值表示。但是存在的问题是比较浪费空间,对于稠密图来说可能比较好一点呢。
- 邻接表
对于每一个节点创建一个链表表示和它相连的边的情况。优点是比较节省存储空间,缺点的话就是求某个节点的入度的话就要遍历所有的链表,效率比较低。
最小生成树
什么是最小生成树
树的所有边权值加起来最小的树就是最小生成树。
- 最小生成树的应用:城市联通网的建立,使用最小的耗材,可以使用最小生成树。
最小生成树的求解方法(参考视频,感谢老师)
- 普利姆算法
按照顶点递增的顺序不断增加顶点到树中来,增加的时候遍历已经选择的生成的树的所有的节点的边,找到权值最小的边并且没有被选中而且不会构成图的边加入到树中。
- 克鲁斯卡尔算法(参考视频,感谢老师)
按照边的权值递增的顺序构造最小生成树,每次选择边的权值最小的进行连接,如果构成图则跳过,直到所有的顶点都构造到树中。
克鲁斯卡尔算法和普利姆算法的区别
普利姆算法是将选中的顶点和未选择的顶点分成两个集合,复杂度和顶点的数量有关。
科里斯卡尔算法则看的是边的数量。
最短路径
最短路径和最小生成树不同的是最小生成树只能保证整个树的权值最小但是两个点的距离不一定最小,最短路径能够保证两个点之间的路径最小。
- 应用:计算机网络和交通网络,比如两个通信双方进行选择最短的路由进行信息的转发,路由器就需要具备这样的能力。
最短路径的解决算法
- 缔结特斯拉算法(参考视频)
1:初始化的时候选择一个点与其他所有点的距离,不直接相连的标记未无穷
2:选择距离最短的路径
3:用新加入的距离最短的顶点遍历其他的顶点,刷新最短路径
4:反复进行以上2、3步骤。
时间复杂度O(n^2)
- 弗洛伊德算法(参考)
类似于动态规划,可以参考这个文章。