|
发表于 2021-9-7 21:18:23
|
显示全部楼层
本楼为最佳答案
 - #include <iostream>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #define IOS \
- ios::sync_with_stdio(false); \
- cin.tie(0); \
- cout.tie(0)
- const int N = 1e5+5,M = 2e5+5;
- int n,m;
- int p[N],path[N];
- int find(int a){
- if (p[a] != a) p[a] = find(p[a]);
- return p[a];
- }
- struct Edge{
- int a,b,w;// 需要对边排序,用结构体存储
- bool operator< (const Edge& W) const{
- return w < W.w;// 重载小于号
- }
- }edge[M];
- int kruskal(){
- sort(edge + 1,edge + m + 1);// 数组从下标为1开始存边
- for (int i = 1; i <= n; i ++ ) p[i] = i;// 初始化并查集
-
- int res = 0,cnt = 0;// res存放最小生成树的边权之和,cnt存放最小生成树的边数
- for (int i = 1;i <= m;i ++){
- int a = edge[i].a,b = edge[i].b,w = edge[i].w;
- a = find(a),b = find(b);
- if (a != b){
- p[a] = b;
- res += w;
- cnt ++;
- path[cnt] = i;
- }// n个点一共n-1条边
- if (cnt == n-1) break;// 处理完提前退出
- }
- return res;
- }
- int main(){
- IOS;
-
- cin >> n >> m;
- int u,v,w;
- for (int i = 1; i <= m; i ++ ){
- cin >> u >> v >> w;
- edge[i] = {u,v,w};
- }
-
- int res = kruskal();
- for (int i = 1;i <= n-1;i ++){
- int id = path[i];
- cout << edge[id].a << ' ' << edge[id].b << ' ' << edge[id].w << '\n';
- }
- cout << res << '\n';
- return 0;
- }
复制代码
自己写的,没有按照你给的代码 |
|