图是什么?可以直观的看下面的这样的数据结构,这就是图:
在此基础上,我们可以在连接线上加权重,加方向:
可以这样说,二叉树与链表都可以称为特殊的图;
在程序员的开发中有哪些地方用到图?比如线程状态的转换:
那么现在我们考虑这样一个问题,把所有的顶点连接起来,计算最小路径:
比较笨的方法:我们将所有的顶点进行排序
1个数: 1种组合
2个数: 2种组合
3个数(a,b,c): 6种组合(abc,acb,bac,bca,cab,cba)
4个数(a,b,c,d): 24种组合(abc,acb,bac,bca,cab,cba)
f(n) = n!
然后将所有的路径算出来,再比较路径长短,这个肯定效率低;
比较经典的最小生成树的算法如下:
Kruskal算法:
Prim算法:
拓扑排序:
通俗点讲就是将图转换为一个序列,这个序列并不唯一:
- 1:删除1或2输出
- 2:删除2或3以及对应边
- 3:删除3或者4以及对应边
- 3:重复以上规则步骤
图的几种最短路径算法的实现:
深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法。。。。。
深度优先搜索算法(DSF):
深度优先搜索算法(BSF):
弗洛伊德算法:
迪杰斯特拉算法: