图论

本文介绍了图论中的关键概念,如图的连通性、生成树、最小生成树及其算法(Prime算法与Kruskal算法)。此外,还探讨了拓扑排序的概念及实现方法,以及最短路径问题的两种解决方案——Dijkstra算法与Floyd算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图论

图的连通性

生成树

最小生成树

prime算法

把所有的点分成两类,一类是已到达的,一类是未到达的。初始化,源点为已到达点,其它均为不可到达点。然后从已到达点堆 到 不可到达点堆的 所有边中挑出代价最小的一条边加入生成树中,再将连接的这个点加入已到达点堆,依次迭代,直到所有点都可到达。

时间复杂度:O(n^2)

kruskal算法

把所有边排序,依次取最小的边,如果不构成环则把它加入生成树中。(利用并查集)

时间复杂度:O(n^2)

拓扑排序

由某个集合上的一个偏序得到该集合上的一个全序,这个操作称为拓扑排序。

算法如下:
1. 在有向图中选一个没有前驱的顶点且输出之(如果有多个,则任意输出一个)
2. 从图中删除该顶点和所有已它为尾的弧(入度为0的结点)
3. 重复上面两个步骤,直到全部顶点都输出

最短路径

Dijkstra算法

分集合,确定最优解。然后延伸,比如上一步已经将Vk加入S集合,则下一步考虑Vk所能到达的点,并与集合中结点到下一个j的距离比较。如果小,则更新。并加入到S集合。

  1. 最短路径的最优子结构性质
    该性质描述为:如果P(i,j)={Vi….Vk..Vs…Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。假设P(i,j)={Vi….Vk..Vs…Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P’(k,s),那么P’(i,j)=P(i,k)+P’(k,s)+P(s,j)

Floyod算法

算法过程:
1、用D[v][w]记录每一对顶点的最短距离。
2、依次扫描每一个点u,并以其为基点再遍历所有每一对顶点D[v][w]的值,看看是否可用过该基点让这对顶点间的距离更小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值