题解 | #最小生成树#
最小生成树
https://www.nowcoder.com/practice/735a34ff4672498b95660f43b7fcd628
#include <cmath> #include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回最小的花费代价使得这n户人家连接起来 * @param n int整型 n户人家的村庄 * @param m int整型 m条路 * @param cost int整型vector<vector<>> 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价 * @return int整型 */ int n = 5003; int father[5003]; //初始化并查集 void init(){ for(int i=0;i<n;i++){ father[i] = i; } } //并查集里面寻根 int find(int u){ if(father[u] == u){ return u; }else{ father[u] = find(father[u]); return father[u]; } } //将 u->v 加入并查集 void join(int u,int v){ u = find(u); v = find(v); if(u == v) return; father[v] = u; } //判断 u v 是否为同一个根 bool same(int u,int v){ u = find(u); v = find(v); return u == v; } int miniSpanningTree(int n, int m, vector<vector<int> >& cost) { // write code here int ans = 0; //kruskal // 对邻接表按照边权递增排序 sort(cost.begin(),cost.end(),[](vector<int>&a,vector<int>&b){ return a[2] < b[2]; }); // 从最小的边开始遍历 init(); for(auto vec:cost){ // 检查边的两边是否在同一个并查集中 if(!same(vec[0],vec[1])){ ans += vec[2]; join(vec[0], vec[1]); } } return ans; } };
kruskal算法+并查集