prim算法
一个连通图的生成树是它的极小连通子图,在n个顶点的情况下,有n-1条边。也就是说,生成树是对连通图而言的,是连通图的极小连通子图,包含图中的所有顶点,有且仅有 n-1 条边。
在图论中,我们常常将树定义为一个无回路连通图。对于一个带权的无回路连通图,其每个生成树所有边上的权值之和不能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树。。常见的求最小生成树的方法有两种:克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法。下面介绍Prim算法。
那我们如何选择这n个顶点,使得这n个顶点组成的n-1条边的总长度最短呢?
我们从顶点1开始,把顶点1加入生成树集合(顶点集合),在一端以顶点1为端点的边中,选择一条最短的,把另一个端点加入生成树;然后选择一条到生成树最短的边,把此时这条边一个端点肯定在生成树中,把另一个端点也加入生成树。依次选择到生成树最短的边……直到选择了n-1条边为止。
Prim算法的原理:
先从顶点1开始,每次选择到生成树最小的边,然后把这条边另一个端点加入生成树;再选择到生成树最短的边,把另一个端点加入生成树;…… 直到选择了n-1条边为止。
本算法的关键在于如何求各个顶点(不在生成树内)到生成树的最短边?
程序中我们定义了一个数组dis[i],表示顶点i到生成树的最短距离,那么就解决了这个问题。
同时&#