题解 | #最小生成树#
最小生成树
http://www.nowcoder.com/practice/735a34ff4672498b95660f43b7fcd628
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回最小的花费代价使得这n户人家连接起来
* @param n int n户人家的村庄
* @param m int m条路
* @param cost intvector<vector<>> 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价
* @return int
*/
int find(vector<int>& parent,int index){//并查集,用来寻找集合的代表节点的函数
if(parent[index]==index) return index;
else return find(parent,parent[index]);
}
int miniSpanningTree(int n, int m, vector<vector<int> >& cost) {
sort(cost.begin(),cost.end(),[](vector<int> x1,vector<int>x2){//从小到大排序
return x1[2]<x2[2];
});
vector<int> parent(n+1);
for(int i = 0;i<=n;i++){//初始化,按道理从1开始就行
parent[i] = i;
}
int res = 0;
int ans = 0;
for(int i = 0;i<m;i++){
int i1 = find(parent,cost[i][0]);
int i2 = find(parent,cost[i][1]);
if(i1!=i2){
parent[i1] = parent[i2];//代表节点的替换
res+=cost[i][2];
ans+=1;
}
if(ans == n-1)break;//n个点都有连接了
}
if(ans<n-1) return -1;
return res;
}
};