【问题描述】
给出N个顶点、E条边的连通无向简单图,请你完成下列任务:
任务1、求边权和最小的生成树(最小生成树)
任务2、求边权和最大的生成树(最大生成树)
任务3、求最大边最小的生成树(瓶颈生成树)
任务4、求最小边最大的生成树(瓶颈生成树)
【输入格式】
第一行:两个整数N,E(N<=50000,E<=100000),分别表示有N个新岛,E对能直接用电缆连接的岛屿,其中主岛为1。
接下来M行:每行三个数u,v,w,1<=u,v<=N,表示岛屿u和v之间可以直接用电缆连接,距离为w(<=100000)。
【输出格式】
第一行一个整数,表示最小生成树的边权和;
第二行一个整数,表示最大生成树的边权和;
第三行一个整数,表示最大边最小的生成树中,最大边的权值;
第四行一个整数,表示最小边最大的生成树中,最小边的权值;
【输入样例】
5 8
1 2 2
1 3 12
1 4 10
2 3 8
2 5 9
3 4 6
3 5 3
4 5 7
【输出样例】
19
39
8
8
【数据范围】
N<=50000,E<=100000
分析:
这道题的解答重点在于思路,要求生成树最优,于是可以采用贪心的办法,先按边权大小进行排序然后不断将边加入无向图中(注意如果在家这条边之前这条边的两个端点就已经连通了就不用考虑这条边了)直到此图变为一棵树,这就是著名的kruskal算法。
并查集+kruskal算法代码实现如下:
#include<cstdio>
#include<cmath>
#include