假设要在n个城市之间建立通信网络,则连通n个城市只需要n-1条线路。现在想节省光缆,使得路径和最小。
这一问题就是最小代价生成树问题(Minimum Cost Spanning Tree),简称MST。
MST性质:假设N=(V, {E})是一个连通图,U是顶点集合V的一个非空子集,若(u, v)是一条具有最小权值的边,u属于U且v属于V-U。则必存在一棵包含边(u, v)的最小生成树。
因此,可以采用贪心算法解决。
1、Prim(普里姆)算法
我们需要设置[......]
假设要在n个城市之间建立通信网络,则连通n个城市只需要n-1条线路。现在想节省光缆,使得路径和最小。
这一问题就是最小代价生成树问题(Minimum Cost Spanning Tree),简称MST。
MST性质:假设N=(V, {E})是一个连通图,U是顶点集合V的一个非空子集,若(u, v)是一条具有最小权值的边,u属于U且v属于V-U。则必存在一棵包含边(u, v)的最小生成树。
因此,可以采用贪心算法解决。
1、Prim(普里姆)算法
我们需要设置[......]
1、在图结构中,结点关系是任意的:任意两个数据元素(结点)之间都可能有关系。
2、有向图可以表示为G={V, A},V是顶点集合,A是关系(边)的集合,也可称作VR。关系(边)用有序对<v, w>表示。图形表示是一条有向弧。v是初始点(弧尾),w是终端点(狐头)。
3、无向图一般表示为G={V, E},V还是顶点集合,E是边集合。边用无序对(v, w)表示。图形表示是一条边(无向)。
有向图G1:
A1 = {[......]
树的计数问题:具有n个结点的不同形态的树共有多少棵。即具有n个结点、互不相似的二叉树的数目bn。
二叉树的相似:两棵都为空树或者两棵都不是空树,而且它们的左右子树分别相似。
二叉树的等价:两者不仅相似,而且对应结点上的元素均相同。
二叉树在bn较小的时候形态和计数如下:
经过书上复杂的推导,含有n个结点的互不相似的二叉树个数为:
如果推广一下,不是二叉树而是树,则:
具有n个结点的互不相似的树的个数为tn = bn-1
即:
有许多问题,可以利用试探和回溯的搜索技术求解。
求解的过程实际是先序遍历一棵“状态树”的过程。
例1:有集合A = {1, 2, ...n},求A的全部子集。
思路:从求全部子集(幂集)这个事情上,实际上对每个元素只有两个状态:要么在一个子集中,要么不在。
因此,可以逐一对A中每个元素进行“取”和“舍”,从而构造一棵完全二叉树。
算法如下:
注意这里是1~n,不是0~n
void mj(int n, int pos, int* flag)
{
i[......]
路径长度:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称作路径长度。
树的路径长度:从树根到每一个结点的路径长度之和。
结点的带全路径长度:从该结点到树根之间的路径长度与结点上权的乘积。
树的带全路径长度:树中所有叶子结点的带全路径长度之和,WPL = Σ (wi x li),其中wi是叶子结点的权重,li是从根到该叶子结点的路径长度,注意,带全路径长度只有叶子结点有权重!其他结点只计算长度无权重!。
来看书上三个树的WPL: