課程
/后端開發
/C++
/數據結構探險之圖篇
?\除了邊沒有被訪問過這個條件外,是不是還要考慮兩個頂點是不是都被訪問過。例如:A-B的權值為2時,不考慮兩個頂點是否都被訪問過的話,A、B、F就成了一個環,明顯不對。
2016-08-18
源自:數據結構探險之圖篇 4-3
正在回答
是有錯的,這個算法。因為第一個for循環找出的是最后一條沒有被選擇的邊,但是該邊的大小如何是未知的,本來無所謂的。但是第二個for循環的i起始是上一次的i。假如,最短的邊在i前,就無法選出正確的邊。解決辦法也很簡單,就是用冒泡法,比較所有的沒被選擇的邊,選出最小的就行
醉獨醒 提問者
qq_慕斯卡2428267
我想問那個,他首先調用primTree(int nodeIndex)的nodeindex 一開始并未使m_bisvisited為true,感覺會導致閉環的問題
/* ??????A ??/???|???\ ?/????|????\ B——-F——-E \????/??\??/ ?\?/?????\/ ??C———-D ??A?B?C?D?E?F?G ??0?1?2?3?4?5?6 ??A-B?6???A-E?5???A-F?1 ??B-C?3???B-F?2??? ??C-F?4(8)???C-D?7 ??D-F?8(4)???D-E?2 ??E-F?9 ?? */ int?Map::getMinEdge(vector<Edge>?edgeVec) { int?minWeight?=?0; int?edgeIndex?=?0; int?i?=?0; for?(?;?i?<?(int)edgeVec.size();?i++) { if?(!edgeVec[i].m_bSelected) { minWeight?=?edgeVec[i].m_iWeightValue; edgeIndex?=?i; break; } } //獲取最小邊失敗的情況 if?(minWeight?==?0) { return?-1; } //這里i的值可以不從零開始 for?(?;?i?<?(int)edgeVec.size();?i++) { if?(edgeVec[i].m_bSelected) { continue; } else { //判斷是否形成回環,形成回環時,此最小權值的邊應該舍去 if?(m_pNodeArray[edgeVec[i].m_iNodeIndexB].m_bIsVisited) { continue; } if?(minWeight?>?edgeVec[i].m_iWeightValue) { minWeight?=?edgeVec[i].m_iWeightValue; edgeIndex?=?i; } } } return?edgeIndex; }
上面是修改的代碼和C-F 4(8) ??D-F 8(4) 兩條邊的權值的修改,下邊圖片是修改后我運行的結果。
我也有同樣的疑惑
我照著打代碼也是調整到最小邊這里出錯
舉報
圖是眾多實際問題解決方案之源,從基礎概念入手掌握圖的處理
1 回答最小邊的點集合問題
1 回答我覺得是不是一個for循環就可以找到最小邊了???
1 回答最小生成樹問題
4 回答重置頂點那個函數有什么用?。?/p>
3 回答克魯斯卡爾算法的循環條件應該是看某個點集是否包含所有點吧,不應該是看邊的數量吧?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-10-25
是有錯的,這個算法。因為第一個for循環找出的是最后一條沒有被選擇的邊,但是該邊的大小如何是未知的,本來無所謂的。但是第二個for循環的i起始是上一次的i。假如,最短的邊在i前,就無法選出正確的邊。解決辦法也很簡單,就是用冒泡法,比較所有的沒被選擇的邊,選出最小的就行
2017-09-01
我想問那個,他首先調用primTree(int nodeIndex)的nodeindex 一開始并未使m_bisvisited為true,感覺會導致閉環的問題
2017-03-06
上面是修改的代碼和C-F 4(8) ??D-F 8(4) 兩條邊的權值的修改,下邊圖片是修改后我運行的結果。
2017-03-06
我也有同樣的疑惑
2016-08-19
我照著打代碼也是調整到最小邊這里出錯