数据结构(十七)最小生成树

最小生成树的目标是把本来一个包含n个节点的二维图结构,用n-1条边连接起来,并且这些边的长度总和最小。

算法原理

dijkstra算法有点类似,假设图中有顶点V={ABCDEF},我们要生成最小生成树。准备两个集合S_frozeen={}S_inactive={ABCDEF}S_frozeen我们称之为源,

最小生成树prim算法流程为:每次提取S_inactive中离源S_frozeen小的边(这边需要主要dijkstra是离源距离最小的点)对应的顶点,添加到源S_frozeen中,n个顶点,需要添加n次,直到S_inactive为空为止。与dijkstra算法的区别在于dijkstra算法每次比较更新

nodes[j].distance_to_src>graph[min_index][j]+nodes[min_index].distance_to_src;

而最小生成树只需要每次比较更新:

nodes[j].distance_to_src>graph[min_index][j]

其他的都不变。

代码实现

示例:https://www.jianshu.com/p/efcd21494dff

数据结构(十七)最小生成树_第1张图片 

根据前面的博文我们写过的dijkstra算法,只需要修改一行代码,就可以实现了。

#include 
#include 

using namespace std;
class min_tree{
public:
    min_tree(){};
    ~min_tree(){};
    class node{
    public:

        node(){
            S_flag= false;
            distance_to_src=1e5;
            pre_node=-1;
        };
        ~node(){};
        bool S_flag;
        int pre_node;
        int distance_to_src;
    };
    //求0号定点到1,2,3,4,5定点的最短路径
    std::vector> example_graph(){

        float max_number=1e5;
        int node_number=6;
        std::vector>graph(node_number);
        for (int i = 0; i >graph=example_graph();
        int n=graph.size();
        std::vectornodes(n);
        nodes[0].distance_to_src=0;

        for (int step = 0; step new_idst)
                    {
                        nodes[j].distance_to_src=new_idst;
                        nodes[j].pre_node=min_index;
                    }

                }

            }


        }

        char str[]={'a','b','c','d','e','f'};
        for (int i = 0; i 

结果最小生成树的边为:a-cb-cb-fb-df-e

数据结构(十七)最小生成树_第2张图片

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