最小生成树:

1.Prim 算法(普利姆)

朴素版:稠密图

堆优化版:一般不用,稀疏图用Kruskal算法

2.Kruskal 算法(克鲁斯卡尔)稀疏图

二分图:

1.如何判别是否是二分图:染色法

2.求二分图的最大匹配:匈牙利算法

最小生成树

点击查看

朴素版Prim 算法O(n^2)

点击查看

①初始化所有点的距离

②for(i = 0; i < n; ++i){

//一个点到集合的距离是指:这个点到集合内部所有边中长度最短的那个

​ 找到集合外距离最近的点->t;

​ 用t更新其他点到集合的距离;

​ st[t] = true;把t加到集合中去

}

例题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。

求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。

给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。

由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。

输入格式
第一行包含两个整数 n 和 m。

接下来 m 行,每行包含三个整数 u,v,w,表示点 u 和点 v 之间存在一条权值为 w 的边。

输出格式
共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。

数据范围
1≤n≤500,
1≤m≤105,
图中涉及边的边权的绝对值均不超过 10000。

输入样例:
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
输出样例:
6
1

堆优化版Prim 算法O(mlogn)

点击查看

Kruskal 算法O(mlogm)

点击查看

二分图

点击查看

染色法 O(n + m)

点击查看

匈牙利算法 最坏O(mn)

点击查看