第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

為什么克魯斯卡爾算法輸出會(huì)這樣呢

http://img1.sycdn.imooc.com//593689030001d89b12230639.jpg

http://img1.sycdn.imooc.com//593689030001b59519201039.jpg


下面是我看著老師的視頻寫的代碼,我看了好幾遍,沒(méi)發(fā)現(xiàn)有什么不同,但是就是出錯(cuò),不知道什么原因。

同樣的代碼,普力馬算法就正常


void?CMap::kruskalTree()
{
	int?value?=?0;
	int?edgeCount?=?0;

	//定義存放結(jié)點(diǎn)集合的數(shù)組
	vector<vector<int>>?nodeSets;

	//第一步:取出所有邊
	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);
			}
		}
	}

	//第二步:從所有邊中取出組成最小生成樹(shù)的邊
	//1.找到算法結(jié)束條件
	while?(edgeCount?<?m_iCapacity?-?1)
	{
		//2.從邊集合中找到最小邊
		int?minEdgeIndex?=?getMinEdge(edgeVec);
		edgeVec[minEdgeIndex].m_bSelected?=?true;

		//3.找出最小邊連接的點(diǎn)
		int?nodeAIndex?=?edgeVec[minEdgeIndex].m_iNodeIndexA;
		int?nodeBIndex?=?edgeVec[minEdgeIndex].m_iNodeIndexB;

		bool?nodeAIsInSet?=?false;
		bool?nodeBIsInSet?=?false;

		int?nodeAInSetLabel?=?-1;
		int?nodeBInSetLabel?=?-1;

		//4.找出點(diǎn)所在的點(diǎn)集合
		for?(int?i?=?0;?i?<?(int)nodeSets.size();?i++)
		{
			nodeAIsInSet?=?isInSet(nodeSets[i],?nodeAIndex);
			if?(nodeAIsInSet)
			{
				nodeAInSetLabel?=?i;
			}
		}

		for?(int?i?=?0;?i?<?(int)nodeSets.size();?i++)
		{
			nodeBIsInSet?=?isInSet(nodeSets[i],?nodeBIndex);
			if?(nodeBIsInSet)
			{
				nodeBInSetLabel?=?i;
			}
		}

		//5.根據(jù)點(diǎn)所在集合的不同做出不同的處理
		if?(nodeAInSetLabel?==?-1?&&?nodeBInSetLabel?==?-1)
		{
			vector<int>?vec;
			vec.push_back(nodeAIndex);
			vec.push_back(nodeBIndex);
			nodeSets.push_back(vec);
		}
		if?(nodeAInSetLabel?==?-1?&&?nodeBInSetLabel?!=?-1)
		{
			nodeSets[nodeBInSetLabel].push_back(nodeAIndex);
		}
		if?(nodeAInSetLabel?!=?-1?&&?nodeBInSetLabel?==?-1)
		{
			nodeSets[nodeBInSetLabel].push_back(nodeBIndex);
		}
		if(nodeAInSetLabel?!=?-1?&&?nodeBInSetLabel?!=?-1?&&?nodeAInSetLabel?!=?nodeBInSetLabel)
		{
			mergeNodeSet(nodeSets[nodeAInSetLabel],?nodeSets[nodeBInSetLabel]);
			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;
	}
}

bool?CMap::isInSet(vector<int>?nodeSet,?int?target)
{
	for?(int?i?=?0;?i?<?(int)nodeSet.size();?i++)
	{
		if?(nodeSet[i]?==?target)
		{
			return?true;
		}
	}

	return?false;
}

void?CMap::mergeNodeSet(vector<int>?&nodeSetA,?vector<int>?nodeSetB)
{
	for?(int?i?=?0;?i?<?(int)nodeSetB.size();?i++)
	{
		nodeSetA.push_back(?nodeSetB[i]?);
	}
}


正在回答

1 回答

從報(bào)錯(cuò)信息上看是容器下標(biāo)越界的意思就是說(shuō)你容器的區(qū)間傳入了錯(cuò)誤的值或大或小。

隨后檢查了代碼在75行處nodeSets[nodeBInSetLabel].push_back(nodeBIndex);下標(biāo)處應(yīng)該是nodeAInSetLabel 修改看看可否解決問(wèn)題。

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

騎著毛驢追太陽(yáng) 提問(wèn)者

非常感謝!
2017-08-08 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消

為什么克魯斯卡爾算法輸出會(huì)這樣呢

我要回答 關(guān)注問(wèn)題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)