c++ - 标记为连接组件的列表表示
问题描述
我使用路径压缩(Sedgewick & Wayne)进行了加权快速联合,并填充了一个数组,比如说,id[i],其中连接的组件根据不同的根放置。如果 id[i] == i,则 i 是根。如果不是,id[i] 是 i 的父级。我的问题是如何从这个数组中获取“连接组件列表(不同的根)”。我对如何找到每个 id 的根感到困惑,因为它们只指向直接父级。
以下是按 i 顺序排列的 id[i] 值(父母或祖父母):0 1 1 1 1 1 1 1 1 1 1 11 11 13 14 1 1 1 1 19 20 1 1 23 24 24 23 27 27 57 29 29 29 29 29 29 29 29 29 29 29 41 29 29 29 29 29 29 29 29 50 51 51 29 29 29 29 57 29 29 60 57 57 57 57 57 65 65 29 69 69 57 57 57 57 57 57 57 57 29 57 57 57 57 57 57 29 87 57 57 57 57 57 57 57 29 96 57 57 57 57 57 57 57 57 57 29 29 29 29 110 57 57 57 57 57 29 29 118 57 57 57 57 57 57 29 29 144 57 57 57 57 57 29 29 144 144 144 57 57 57 57 57 29 29 29 29 29 29 29 29 29 57 57 57 57 57 57 29 29 29 29 29 29 29 29 29 29 757 57 5757
我的代码是:
vector<vector<short>> components() {
vector<short> root, separated;
vector<vector<short>> list;
for (int i = 0; i < id.size(); i++) {
if (i == id[i]) root.push_back(i);
else id[i] = id[id[i]];
}
for (int j = 0; j < root.size(); j++) {
separated.clear();
for (int i = 0; i < id.size(); i++) { if (root[j] == id[i]) separated.push_back(i); }
list.push_back(separated);
}
std::sort(list.begin(), list.end(), [](const vector<short> & a, const vector<short> & b) { return a.size() > b.size(); });
return list; // return a list of connected components labelled
}
///////////////////////////////////////////////////////////////////
I have managed to fix the above code as follows:
vector<vector<short>> components() {
vector<short> root, separated;
vector<vector<short>> list;
for (int i = 0; i < id.size(); i++) id[i] = find(i);
for (int i = 0; i < id.size(); i++) if (i == id[i]) root.push_back(i);
for (int j = 0; j < root.size(); j++) {
separated.clear();
for (int i = 0; i < id.size(); i++) { if (root[j] == id[i]) separated.push_back(i); }
list.push_back(separated);
}
std::sort(list.begin(), list.end(), [](const vector<short> & a, const vector<short> & b) { return a.size() > b.size(); });
return list;
}
int find(int p) {
while (p != id[p]) {
id[p] = id[id[p]];
p = id[p];
}
return p;
}
现在它工作正常。
解决方案
推荐阅读
- python - Google AppEngine Python 3.7 上的自定义库
- angularjs - 从 angulajs 接收到空数据到 MVC 控制器
- javascript - 为什么 webpack tapable 使用 new Function('xx', 'some string code') 生成函数而不是直接写函数?
- php - 在执行“php artisan migrate”时,我得到:基表或视图已经存在:1050 表“用户”。(我正在使用 PHPSTORM 2018.3.4)
- entity-framework - 实体框架弹性和重试逻辑
- node.js - 有没有办法使用任何 npm 或谷歌云 API 从节点获取虚拟机的外部 IP 地址?
- android - 添加地理围栏插件后无法构建科尔多瓦项目
- php - 使用 HTML 表单向 mysql 数据库发送空字符串
- ios - UIButton高度约束迅速不起作用
- python - 防止机器人为 message.mentions 发送多条消息