最小生成树
图论中,树是图的一种特殊形式,它的众多性质中有两个是求解最小生成树的Prim算法和Kruskal算法的基础:
(1)用一条边连接树中的任意两个顶点都会产生一个新的环;
(2)从树中删去一条边将会得到两棵独立的树。
无权图中的边只是单纯的作为联系两个顶点的抽象概念,而带权图(也称加权图)中为边增加了权重,使得顶点之间的路径形式变得更丰富多样。图的生成树是它的一棵含有其所有顶点的无环连通子图,而带权图的最小生成树(Minimun Spanning Tree,MST)是指生成树中所有边的权值之和最小的生成树。
定义加权无向图的结构如下:
//加权图
struct EdgeWeightedGraph
{
size_t V; //顶点数
size_t E; //边数
map<int, forward_list<tuple<int, int, double>> adj; //改进后的邻接表,tuple存储的是边集
}
由于我们用STL的tuple作为边的存储容器,而tuple的比较操作不符合我们的要求,所以我们得自己定义一个比较操作: