图是由顶点和边构成的抽象网络。在无向图中,连通且不含圈的图,即不能形成环,称为树。n个顶点,图的最大边数为n-1+n-2+... 而树恒为n-1。
在各大城市中建设通信网络,如下图所示,每个圆圈代表一座城市,而边上的数字代表了建立通信连接的价格。那么,请问怎样才能以最小的价格使各大城市能直接或者间接地连接起来呢?
寻找最小生成树,即寻找n-1条边,其权值和最小,且将所有顶点连通起来构成一棵树。
一、Prim算法
将顶点分为两个集合U V,任取一顶点u加入U,其余为V,取u周围权值最小的一条边,该点为v,将v从V移至U中,对U中每个点寻找最小权值边,该边必须通向V中的一顶点,且不能和已选中的边构成环路。一共寻找n-1条边,将n个顶点相连。
二、Kruskal算法
直接找权值最小的边,确保该边不会构成环即可,n-1次。
至于为何这样选好像挺复杂的,没搞懂。两种算法都需要考虑环的问题,暴力法就用深搜或广搜整个图,优解是使用并查集,图中连通的几个点可以看成在一棵子树上,共享根结点,当合并两点时,若其根结点不同则合并成功。否则说明两点是一家人,子结点连到间接父结点上去了。
详细代码回顾上述两个链接,实在太长了。感觉复杂的树都是由图引申而来,上学期这一块真的看不懂,现在离散有了点集合论知识,虽然没学图论,但感觉有点理解了。