图论

最短路径

朴素的dijkstra算法

找到不在集合内,距离一号点最近的点

1) dis[1] = 0, dis[others] = 正无穷
2for(n次){
	找到不在s中距离s最近的距离
	将已经确定最短距离的点t放入集合s
	用t更新其他点到起点的距离
}
	

堆优化版的dijkstra算法

bellman_ford 算法(带有负权边)

用一个点更新其他所有点的距离,所以可以求不超过k条边的最短路径
bellman_ford算法,可以求有限边的最短路。
求解含有负权边的单源汇最短路,但是效率有些低,使用的原理为用一个点对其他所有点进行松弛,每次松弛,将每条边都更新一下,如果可以在第n次还可以松弛,那么说明图中一定存在负环

算法步骤:

for(k次)
	for(a, b, w);
	d[b] = min(d[b], d[a] + w);

spfa()算法

用一个点更新其他所有点,用队列维护,更新后,存入变小的结点
可以说是对belloman_ford算法的bfs优化版本。
为了更快的求得最小距离,我们每次不在枚举所有的边,而是将所有可以更新距离的点更新距离,而这需用队列维护。

while (q.size(){//队列存上可以更新其他点的点
	int t = q.front();
	q.pop();
	st[t];//表示不在队列里了。
	for (遍历当前点可到达的点){
		更新点,
		入队
		标记入队
	}
}


最小生成树

朴素的prim算法

首先初始化diist全为正无穷
for (int i = 0; i < n; i ++){
	找到集合外距离集合最近的点。
	用t更新其他点到集合的距离
	把t放入st[t]true
}

kruskal算法

将所有边按照权重从小到大排序

枚举每条边a,b和权重c
如果a,b不连通,就将这条边加入集合内。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值