Kruscal最小生成树算法(C++)
来源:互联网 发布:hough变换算法 编辑:程序博客网 时间:2024/05/18 05:25
Kruscal最小生成树算法
算法主体程序
void MyMap::kruscalTree(){ int weightValue = 0; int edgeCount = 0; vector<Edge> edgeVec; vector<vector<int>> nodeVecSet; //找出所有边添加到一个集合 for (int i = 0;i < m_iCapacity;i++) { for (int j = i + 1;j < m_iCapacity;j++) { getValueFromMatrix(i, j, weightValue); if (weightValue != 0) { Edge edge(i, j, weightValue); edgeVec.push_back(edge); } } } while (edgeCount < m_iCapacity - 1) { int nodeIndexA = 0; int nodeIndexB = 0; //找出最小边,将其与其顶点保存 int minEdgeIndex = getMinWeightEdge(edgeVec); edgeVec[minEdgeIndex].m_bIsSelected = true; //找到最小边的顶点 nodeIndexA = edgeVec[minEdgeIndex].m_iNodeIndexA; nodeIndexB = edgeVec[minEdgeIndex].m_iNodeIndexB; //查看是否已在顶点集合的数组中,并记录其所在顶点集在数组中的索引 int vecIndexA = -1; int vecIndexB = -1; for (int i = 0; i < (int)nodeVecSet.size(); i++) { //找到A所在的顶点集合在数组中的索引 if (isNodeInVec(nodeVecSet[i], nodeIndexA)) { vecIndexA = i; } //找到B所在的顶点集合在数组中的索引 if (isNodeInVec(nodeVecSet[i], nodeIndexB)) { vecIndexB = i; } } //顶点未添加时,新建集合并将其顶点添加至集合中,集合添加至集合数组中 if (vecIndexA == -1 && vecIndexB == -1) { vector<int> nodeVec; nodeVec.push_back(nodeIndexA); nodeVec.push_back(nodeIndexB); nodeVecSet.push_back(nodeVec); } //A已在集合中,而B不在,将B添加至A所在的集合 if (vecIndexA != -1 && vecIndexB == -1) { nodeVecSet[vecIndexA].push_back(nodeIndexB); } //B已在集合中,而A不在,将A添加至B所在的集合 if (vecIndexA == -1 && vecIndexB != -1) { nodeVecSet[vecIndexB].push_back(nodeIndexA); } //A,B已添加但在两个集合中,将这两个集合合并 if (vecIndexA != -1 && vecIndexB != -1 && vecIndexA != vecIndexB) { mergeVecInSet(nodeVecSet[vecIndexA], nodeVecSet[vecIndexB]); for (int k = vecIndexB;k < (int)nodeVecSet.size() - 1;k++) { nodeVecSet[k] = nodeVecSet[k + 1]; } } if (vecIndexA != -1 && vecIndexB != -1 && vecIndexA == vecIndexB) { continue; } //最小边保存至最小边集合,并标为已选择 m_pEdge[edgeCount] = edgeVec[minEdgeIndex]; cout << edgeVec[minEdgeIndex].m_iNodeIndexA << "-----" << edgeVec[minEdgeIndex].m_iNodeIndexB<<" : "; cout << edgeVec[minEdgeIndex].m_iWeight << endl; edgeCount++; }}
判断节点是否已添加的程序
bool MyMap::isNodeInVec(vector<int> nodeVec, int nodeIndex){ for (int i = 0;i <(int) nodeVec.size();i++) { if (nodeIndex == nodeVec[i]) { return true; } } return false;}
合并顶点集合的程序
void MyMap::mergeVecInSet(vector<int> &nodeVecA, vector<int> nodeVecB){ for (int i = 0; i < (int)nodeVecB.size();i++) { nodeVecA.push_back(nodeVecB[i]); }}
0 0
- Kruscal最小生成树算法(C++)
- 最小生成树 kruscal算法 C语言
- kruscal最小生成树算法
- 最小生成树-Kruscal算法
- KRUSCAL算法求图的最小生成树(C实现)
- 算法基础 - 最小生成树(Kruscal算法)
- 最小生成树之kruscal算法
- 最小生成树(prim和kruscal算法)
- 最小生成树 Kruscal算法--poj 2377
- kruscal算法求最小生成树总结
- hiho1098 : 最小生成树·Kruscal算法
- HDU 1233最小生成树 Kruscal 算法
- 最小生成树 Kruscal
- 最小生成树~kruscal
- 最小生成树-kruscal
- 最小生成树的prim算法和kruscal算法
- kruscal求最小生成树
- 最小生成树 prim kruscal
- Prim最小生成树算法(C++)
- Echart动态加载数据
- express4.X框架中使用socket.io
- 前端面试之模块化-2、AMD规范和CommonJS规范
- Dx bad class file magic (cafebabe) or version (0033.0000)的一种解决方法
- Kruscal最小生成树算法(C++)
- hibernate配置---generate_statistics
- nginx服务器究竟是怎么执行php项目
- ios 震动代码
- 图灵机器人快速接入教程
- 不可不知的 Android strings.xml 那些事
- 1091. Acute Stroke (30)
- POJ 2109 Power of Cryptography (传说中的巨坑与五行代码)
- 真机调试出现: linker command failed with exit code 1 (use -v to see invocation)