在这里, 我们把图分为两类:有向图和无向图
对于求最小生成树,有向图和无向图的做法也是不一样的。
解决无向图的算法,主要是有两个:prim和kruskal, 其中,prim用于稠密图,kruskal用于稀疏图。
解决有向图的算法,目前我知道的就是最小树形图。
首先,我们对prim进行一下简述:
1、集合M, N:M的初始状态是图中所有点,N为空;
2、在图中任选一个点,加入N,并从M中删除;
3、在M中找出一个点,它到N中某一点的距离小于M中其他的点到N中任意一个点的距离,将这点加入N,并从M中删除;
4、如果有某一点和集合N中的点没有连接,那么说明这个图是不连通的;同时当图中所有的点都从M移动到N,结束算法,此时的这棵树就是最小生成树。
接下来说一下kruskal算法:
1、将图中每一个点看做是一棵树,将整个图看做事森林;
2、将所有的边按照一定规则进行排序;
3、从小到大将边一次加入到森林中,如果加入一条边后形成了环,那么就把这条边删除,也就是在保证不构成环的情况下将边依次加入到图中;
4、程序结束有两种可能:
(1)当图中所有点都被连到一起,即构成一棵生成树的时候(此时可能还有较大的边没有被遍历),这棵树就是最小生成树;
(2)当所有的边都被遍历一次,但是图还是没有连通,那么说明不存在此图的最小生成树。
最后,总结一下我认为比较有难度的最小树形图:
0、删除图中自环
1、对于除了根节点以外的每个点来说,在它的所有入边中选择最小的,保留;
2、判断此时的图是否有环,以及是否有孤立的点,如果有孤立的点那么说明无法构成最小树形图;
3、如果有环,将环缩为一个点(其实就是一个 决定将环中哪条边删除的过程);(如何把它缩为一个点在下一篇再详细说明)
4、重复第1、2、3步,直到图中没有环为止。
总结:三个算法都是贪心的思想!