生成树

次小生成树

     可以用Prim算法先把i点到j点的最大边权值和最小生成树的权值求出来,再对最小生成树加边cost[i][j],这样成了一个环,然后把i到j的最大边减掉,这样得到的树的权值除最小生成树以外最小,即cMst = min(cMst,(Mst+cost[i][j]-Ma[i][j]));

    也可用Kruskal算法先计算一遍最小生成树并把其上的边标记,然后枚举每条被标记的边,去掉这条边再求一次Kruskal,然后恢复,求min值,就可得到次小生成树的权值。

最小树形图:


生成树_第1张图片

该算法主要拿来解决最小有向生成树

    最小有向生成树:给定一个有向带权图G和其中一个点u,找出一个以u为跟结点,权和最小的有向生成树。有向生成树也叫树形图,是指一个类似树的有向图,满足以下条件:

1.恰好有一个入度为0的点,称为根结点

2.其他结点的入度均为1

3.可以从根结点到达其他结点

    算法的过程如下:

1.找到除了root以为其他点的权值最小的入边。用In[i]记录

2.如果出现除了root以外存在其他孤立的点,则不存在最小树形图。

3.找到图中所有的环,并对环进行缩点,重新编号。

4.更新其他点到环上的点的距离

5.重复3,4直到没有环为止。

最小生成树计数

    先建立矩阵Matrix-tree定理:

生成树_第2张图片
生成树_第3张图片

该矩阵的行列式的值det即为这个图最小生成树的个数。

你可能感兴趣的:(生成树)