1.图的几个概念
(1)连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图
(2)强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图
(3)连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数值,称为权,权代表着连接两个顶点的代价,称这种连通图叫做连通网
(4)生成树:一个连通图的生成树是指一个连通子图,它含有图中全部 n 个顶点,但只有足以构成一棵树的n-1条边。一棵有n个顶点的生成树有且仅有 n-1 条边,如果生成树中再添加一条边,则必定成环
(5)最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树(Minimum Cost Spanning Tree),简称 MST
2.并查集的基本介绍
需要详情,自行百度
// 初始化的模板
int[] pre = new int[n];
for(int i = 0; i < n; i++) {
pre[i] = i;
}
// 查询的模板(含路径压缩)
int find(int x){
if(pre[x] == x) {
return x;
}
// 递归
return pre[x] = find(pre[x]);
}
// 合并的模板
void merge(int x, int y){
int fx = find(x),
int fy = find(y);
if(fx != fy) {
pre[fx] = fy;
}
}
3.克鲁斯卡尔(Kruskal)算法的概述
用于求解图的最小生成树
贪心策略:每次都选择权值最小的边作为最小生成树的边
4.克鲁斯卡尔(Kruskal)算法的基本思路
(1)构造只有 n 个(图 graph 的顶点集合的大小)顶点的森林,即构造一个数组结构的并查集,初始化为各个顶点的终点为顶点自身
(2)把图 graph 中顶点连通的边按照权值从小到大进行排序
(3)按边的权值从小到大取出来,加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止
(4)此时最小生成树有 n 个顶点,n-1 条边,并且 n-1 条边不构成回路
加入边需要注意的事项:
a.判断待加入的边 edge ,加入到当前子图后是否会构成回路,如果构成回路,则取出下一条权值较小的边继续判断,
b.如果不构成回路,则加入当前边 edge 到当前子图中,逐渐构成最小生成树
c.构成回路的判断标准:当前待加入的边所对应的两个顶点在当前子图中的终点是否相同
d.终点的理解:在当前子图