課程
/后端開發(fā)
/C++
/數(shù)據(jù)結(jié)構(gòu)探險之圖篇
請問一下有沒有數(shù)據(jù)結(jié)構(gòu)之探險篇的克魯斯卡爾求最小生成樹的源代碼?
2018-04-26
源自:數(shù)據(jù)結(jié)構(gòu)探險之圖篇 4-8
正在回答
void CMap::kruskalTree()
{
int value = 0;
int edgeCount = 0;
vector<vector<int>> nodeSets;
//之前一直顯示vector subscript out of range,這是因為后面出現(xiàn)對vector直接取vec[]的語句,這是不對的
//因為vector沒有分配空間,我在這里分配空間后就可以了。
nodeSets.resize(m_iCapacity*m_iCapacity);
vector<Edge>edgeVec;
for (int i = 0; i < m_iCapacity; i++)
for (int k = i+1; k < m_iCapacity; k++)
getValueFromMatrix(i, k, value);
if (value != 0)
Edge edge(i,k, value);
edgeVec.push_back(edge);
}
//1.找出算法結(jié)束條件
while (edgeCount < m_iCapacity -1)
//2從邊集合中找出最小邊
int minEdgeIndex = getMinEdge(edgeVec);
edgeVec[minEdgeIndex].m_bSelected = true;
//3找出連接最小邊的點
int nodeAIndex = edgeVec[minEdgeIndex].m_iNodeIndexA;
int nodeBIndex = edgeVec[minEdgeIndex].m_iNodeIndexB;
//4找出點所在的點的集合
bool nodeAIsInSet = false;
bool nodeBIsInSet = false;
int nodeAInSetLabel = -1;
int nodeBInSetLabel = -1;
for (int i = 0; i < (int)nodeSets.size(); i++)
nodeAIsInSet = IsInset(nodeSets[i], nodeAIndex);
if (nodeAIsInSet)//點在指定的集合中
nodeAInSetLabel = i;//A點所在的點集合的索引
nodeBIsInSet = IsInset(nodeSets[i], nodeBIndex);
if (nodeBIsInSet)//點在指定的集合中
nodeBInSetLabel = i;//A點所在的點集合的索引
//5根據(jù)點所在的集合的不同做出不同的處理
if (nodeAInSetLabel == -1 && nodeBInSetLabel == -1)
vector<int>vec;
vec.push_back(nodeAIndex);
vec.push_back(nodeBIndex);
nodeSets.push_back(vec);
else
if (nodeAInSetLabel == -1 && nodeBInSetLabel != -1)//A不在任何集合中
nodeSets[nodeBIndex].push_back(nodeAIndex);
if (nodeAInSetLabel != -1 && nodeBInSetLabel == -1)
nodeSets[nodeAIndex].push_back(nodeBIndex);
if (nodeAInSetLabel != -1 && nodeBInSetLabel != -1 && nodeAInSetLabel != nodeBInSetLabel)
mergeNodeSet(nodeSets[nodeAIndex], nodeSets[nodeBIndex]);//把B合并到A當中,B銷毀
for (int k = nodeBInSetLabel; k < (int)nodeSets.size()-1; k++)
nodeSets[k] = nodeSets[k + 1];
if (nodeAInSetLabel != -1 && nodeBInSetLabel != -1 && nodeAInSetLabel == nodeBInSetLabel)
continue;
m_pEdge[edgeCount] = edgeVec[minEdgeIndex];//保存邊
edgeCount++;
cout << edgeVec[minEdgeIndex].m_iNodeIndexA << "-------------" << edgeVec[minEdgeIndex].m_iNodeIndexB << "? ?";
cout << edgeVec[minEdgeIndex].m_iWeightValue << endl;
舉報
圖是眾多實際問題解決方案之源,從基礎(chǔ)概念入手掌握圖的處理
1 回答圖結(jié)構(gòu)中循環(huán)問題
1 回答關(guān)于代碼的存儲結(jié)構(gòu)
3 回答求問:error C2512: “Edge”: 沒有合適的默認構(gòu)造函數(shù)可用
2 回答矩陣數(shù)組初始化時,為什么在構(gòu)造函數(shù)里面成功了,但是一出構(gòu)造函數(shù)就都變成隨機數(shù)了?
3 回答打印結(jié)果老是不對。
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學習伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2018-04-30
void CMap::kruskalTree()
{
int value = 0;
int edgeCount = 0;
vector<vector<int>> nodeSets;
//之前一直顯示vector subscript out of range,這是因為后面出現(xiàn)對vector直接取vec[]的語句,這是不對的
//因為vector沒有分配空間,我在這里分配空間后就可以了。
nodeSets.resize(m_iCapacity*m_iCapacity);
vector<Edge>edgeVec;
for (int i = 0; i < m_iCapacity; i++)
{
for (int k = i+1; k < m_iCapacity; k++)
{
getValueFromMatrix(i, k, value);
if (value != 0)
{
Edge edge(i,k, value);
edgeVec.push_back(edge);
}
}
}
//1.找出算法結(jié)束條件
while (edgeCount < m_iCapacity -1)
{
//2從邊集合中找出最小邊
int minEdgeIndex = getMinEdge(edgeVec);
edgeVec[minEdgeIndex].m_bSelected = true;
//3找出連接最小邊的點
int nodeAIndex = edgeVec[minEdgeIndex].m_iNodeIndexA;
int nodeBIndex = edgeVec[minEdgeIndex].m_iNodeIndexB;
//4找出點所在的點的集合
bool nodeAIsInSet = false;
bool nodeBIsInSet = false;
int nodeAInSetLabel = -1;
int nodeBInSetLabel = -1;
for (int i = 0; i < (int)nodeSets.size(); i++)
{
nodeAIsInSet = IsInset(nodeSets[i], nodeAIndex);
if (nodeAIsInSet)//點在指定的集合中
{
nodeAInSetLabel = i;//A點所在的點集合的索引
}
}
for (int i = 0; i < (int)nodeSets.size(); i++)
{
nodeBIsInSet = IsInset(nodeSets[i], nodeBIndex);
if (nodeBIsInSet)//點在指定的集合中
{
nodeBInSetLabel = i;//A點所在的點集合的索引
}
}
//5根據(jù)點所在的集合的不同做出不同的處理
if (nodeAInSetLabel == -1 && nodeBInSetLabel == -1)
{
vector<int>vec;
vec.push_back(nodeAIndex);
vec.push_back(nodeBIndex);
nodeSets.push_back(vec);
}
else
if (nodeAInSetLabel == -1 && nodeBInSetLabel != -1)//A不在任何集合中
{
nodeSets[nodeBIndex].push_back(nodeAIndex);
}
else
if (nodeAInSetLabel != -1 && nodeBInSetLabel == -1)
{
nodeSets[nodeAIndex].push_back(nodeBIndex);
}
else
if (nodeAInSetLabel != -1 && nodeBInSetLabel != -1 && nodeAInSetLabel != nodeBInSetLabel)
{
mergeNodeSet(nodeSets[nodeAIndex], nodeSets[nodeBIndex]);//把B合并到A當中,B銷毀
for (int k = nodeBInSetLabel; k < (int)nodeSets.size()-1; k++)
{
nodeSets[k] = nodeSets[k + 1];
}
}
else
if (nodeAInSetLabel != -1 && nodeBInSetLabel != -1 && nodeAInSetLabel == nodeBInSetLabel)
{
continue;
}
m_pEdge[edgeCount] = edgeVec[minEdgeIndex];//保存邊
edgeCount++;
cout << edgeVec[minEdgeIndex].m_iNodeIndexA << "-------------" << edgeVec[minEdgeIndex].m_iNodeIndexB << "? ?";
cout << edgeVec[minEdgeIndex].m_iWeightValue << endl;
}
}