不恋尘世浮华,不写红尘纷扰,不叹世道苍凉,不惹情思哀怨,闲看花开,静待花落,冷暖自知,干净如始。

首先了解图的几个概念:

  • 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。
  • 强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图。
  • 连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。
  • 生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。
  • 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。 
  • 最小生成树--kruskal算法

先由给出一组数据:

a、b、c代表着从a号点到b号点的边权是c,6个点,9条边。

2     4       11

3       5       13

4       6       3

5       6       4

2       3       6

4       5       7

1       2       1

3       4       9

1       3       2

开始要选择最小边的话,就需要排一下序嘛,好啦,手动sort一下(代码排序时还是用结构体比较好)

1       2       1

1       3       2

4       6       3

5       6       4

2       3       6

4       5       7

3       4       9

2       4       11

3       5       13

你以为排好就完了吗?别忘了树是不能成环的,如果只是贪心就会有连成环的情况。

最小生成树--kruskal算法

上图只是用了前几个数据,显然出现了环,所以接下来怎么走呢,还记得并查集吗(如果不记得,可以去我博客算法分类中找哟,这里就不详细说了)并查集是可以判断是否两个点在同一个集合,依据这个数据结构不就可以判断了嘛(●ˇˇ●)

那么我们就可以直接得到最小生成树了????。

最小生成树--kruskal算法

得到结果权值为19,我们可以看到并没有用完所有的数据就得到了最小生成树,显然因为连接n个点最少需要n-1条边就够了,所以当找到的满足条件的n-1条边时就可以退出咯。 

相关文章: