图---生成树与最小生成树

今天在做题的时候遇到一个问题,如何根据图的邻接表来画出DFS生成树和BFS生成树,有两年的真题中涉及到这个问题,在以前的学习中没注意过此问题,由于严奶奶的书上也只是一带而过,所以对它的理解也不深刻,作为基础的知识应该掌握,因此从网上查阅了一些资料,针对这个问题做如下总结,由于提到生成树自然会想到还有一种最小生成树,顺便把生成最小生成树的方法也总结一下,做出更好的区分,给需要的同学提供一个方便:


一.生成树

1.      生成树:是一个极小连通子图,它含有图中全部顶点,但只有n-1条边。

2.      DFS生成树:由深度优先搜索遍历得到的生成树,称为深度优先生成树。

3.      BFS生成树:由广度优先搜索遍历得到的生成树,称为广度优先生成树。

1:无向图G7的两种生成树(从顶点1开始):

说明:使用不同的遍历图的方法,可以得到不同的生成树;从不同的顶点出发,也可能得到不同的生成树。

图---生成树与最小生成树_第1张图片


 2画出下图的生成树

图---生成树与最小生成树_第2张图片

1)邻接表:

图---生成树与最小生成树_第3张图片

要会根据图的邻接表画出DFS,BFS生成树。


2DFS生成树:                                  3BFS生成树:

                                    图---生成树与最小生成树_第4张图片

/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/


二.最小生成树(MSTMinimum cost SpanningTree

1.      最小生成树:n个顶点的生成树很多,最小生成树就需要从这很多树中选一棵代价最小的生成树(即该树各边的代价之和最小)。

2.      构造最小生成树的准则

1)  必须只使用该网络中的来构造最小生成树;

2)  必须使用且仅使用n-1条边来联络网络中的n个顶点;

3)  不能使用产生回路的边。

3.       两种方法:Prime, Kruskal

//严奶奶书上是用表格的形式列出来最小生成树的过程,我觉得那样做挺麻烦的,在下面详细过程之后我描述了一种画线的方法,这种方法来的更容易一些。

1)       Prime

图---生成树与最小生成树_第5张图片


i 1 2 3 4 5 6
Closest[i] 1 1 1 1 1 1
Lowcost[i] 0 6 1 5

 (b)

Closest[i]用于存放顶点序号,Lowcost[i]存放权值)

   图---生成树与最小生成树_第6张图片

i

1

2

3

4

5

6

Closest[i]

1

3

1

1

3

3

Lowcost[i]

0

5

0

5

5

4

(c)

i

1

2

3

4

5

6

Closest[i]

1

3

1

6

3

3

Lowcost[i]

0

5

0

2

5

0

(d)

 图---生成树与最小生成树_第7张图片

i

1

2

3

4

5

6

Closest[i]

1

3

1

6

3

3

Lowcost[i]

0

5

0

0

5

0

(e)

i

1

2

3

4

5

6

Closest[i]

1

3

1

6

2

3

Lowcost[i]

0

0

0

0

3

0

(f)

 

图---生成树与最小生成树_第8张图片

 

i

1

2

3

4

5

6

Closest[i]

1

3

1

6

2

3

Lowcost[i]

0

0

0

0

0

0

                                                     (g)

画线方法

图---生成树与最小生成树_第9张图片




根据每条画的线所穿过的线段就可以找到最小的权值边,比如从顶点1开始,然后画一条黑线,黑线穿过的线段对应的权值分别为615,可见1是最小的,所以连接顶点1与顶点3,然后把顶点1顶点3作为一个整体,画出红色线条,红色线穿过的线段有656455,最小的是4,所以连接顶点3和顶点6,然后把顶点1顶点3顶点6作为一个整体,按照这种方法,依次类推,便可得到最小生成树。


2)      Kruskal

Kruskal的思想我觉得比Prime要容易得多,利用上面的无向图,使用Kruskal生成最小生成树的过程:

图---生成树与最小生成树_第10张图片

你可能感兴趣的:(数据结构)