Prim的解法(记录一下)
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) {
// prim
unordered_set<int> node; // 不重复结点
int ans = 0; // 统计权值
sort(cost.begin(), cost.end(),
[&](std::vector<int> &x1, std::vector<int> &x2) -> bool
{return x1[2] < x2[2];}); // 升序排序
// 确定头个结点
node.insert(cost[0][0]); // 结点加入集合
node.insert(cost[0][1]);
ans += cost[0][2]; // 权值
while (1) {
if (node.size() == n) { // 所有结点被访问
break;
}
for (auto it = cost.begin(); it != cost.end(); it++) {
// 划分集合的方式确保不会形成回路
if ((node.find((*it)[0]) != node.end()) && node.find((*it)[1]) == node.end()
|| node.find((*it)[0]) == node.end() && node.find((*it)[1]) != node.end()) {
node.insert((*it)[0]);
node.insert((*it)[1]);
ans += (*it)[2];
break; // 加入结点后下一个最小权值可能在迭代器前方,不能继续遍历
}
}
}
return ans;
}
};