带有矩阵的普里姆算法
Prim's Algorithm with matrices
本文关键字:算法 更新时间:2023-10-16
我正在尝试用c++和矩阵实现Prim的算法。
我的问题是:
int node[] = {11, 11, 0, 11, 11, 11, 11, 11};
int nodeCon[8];
void generatePrims() {
int cNode = 3;
for (int i = 1; i <= 8; i++) {
if (graph[cNode][i] != 0){
if (node[i] > graph[cNode][i]) {
node[i] = graph[cNode][i];
nodeCon[i] = cNode;
}
}
}
};
cNode为起始节点。
graph[][]
是包含连接的二维矩阵。
nodeCon[]
是保存MST(该节点与其他节点连接)连接的数组
node[]=
保存nodeCon的成本值。
我的问题是如何继续到下一跳?假设我找到了最小连接并将值设置为cNode= minConnection
循环将会是什么样子?我怎么知道我检查了所有的节点?
Thanks in advance
像这样:
int node[]={11,11,0,11,11,11,11,11};
int used[]={0,0,0,0,0,0,0,0,0,0};
int nodeCon[8];
void generatePrims(){
int cNode = 3;
int next, min_now;
for(int i=0; i<8; ++i) {
used[cNode] = 1;
min_now = MAX_INT;
for(int i=1;i<=8;i++){
if(!used[i]){
if(node[i] > graph[cNode][i]){
node[i] = graph[cNode][i];
nodeCon[i]= cNode;
}
if(node[i] < min_now) {
min_now = node[i];
next = i;
}
}
}
cNode = next;
}
};
同样值得注意的是:如果你使用一个未使用的顶点列表而不是数组'used',将会更快。
我目前不能评论上一个答案(因为我没有足够的声誉),所以我将通过另一个答案来评论。Piotr的解决方案几乎是正确的,但我相信Prim的算法考虑的不仅仅是当前节点。一个例子可以在这里看到Prim的算法。这本质上意味着你需要检查你访问过的节点的路径,而不仅仅是最近的节点。
这意味着你需要存储一个包含你访问过的节点和"for each"通过它们的向量,而不是仅仅检查从你访问的最后一个节点开始的路径。
下面的站点实现了算法和一个junit测试类。所以它应该是你要找的。当然,单元测试类有一个实际的矩阵。实现类有代码。
http://www.geekviewpoint.com/java/graph/mst相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何在 Mac 上使用 c++17 并行标准库算法?