#include<algorithm> typedef struct Line { int x, y, z; } Line; // 顶点并查集 #define maxs 5000+5 #define maxl 500000+5 int g[maxs]; bool cmp(Line ls1, Line ls2) { return ls1.z < ls2.z; } int find(int x) { if (g[x] == x) { return x; } else return g[x] = find(g[x]); } class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回最小的花费代价使得这n户人家连接起来 * @param n int n户人家的村庄 * @param m int m条路 * @param cost intvector<vector<>> 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价 * @return int */ int miniSpanningTree(int n, int m, vector<vector<int> >& cost) { // write code here // write code here // 初始化 只能到达自己 for (int i = 0; i <= n; i++) { g[i] = i; } Line ls[maxl]; // 用来统计顶点数目 和代价 int count = 0, minCost = 0; // 入参 for (int i = 0; i < m; i++) { ls[i].x = cost[i][0]; ls[i].y = cost[i][1]; ls[i].z = cost[i][2]; } sort(ls, ls+m, cmp); //先把最短的边放入 g[ls[0].x] = ls[0].y; count+=2; minCost += ls[0].z; // 寻找可以放入并查集的最短边 for (int j = 1; j < m; j++) { if(count==n) break; int x = find(ls[j].x), y = find(ls[j].y); if (x != y) { g[x] = g[y]; count++; minCost += ls[j].z; } } if (count == n) { return minCost; } return -1; } };