为了账号安全,请及时绑定邮箱和手机立即绑定

克鲁斯卡尔算法输出结果为何出现这样的错误呢

如图

http://img1.sycdn.imooc.com//58be7fba0001eaf902260148.jpg

这与老师的不太一样啊

//克鲁斯卡尔算法生成树

void CMap::kruskalTree() 
    {
    	int value=0;//取权值
		int edgeCount=0;//取出最小生成树边的个数 
		
    	//定义存放结点集合的数组 (数组的数组) 
		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);
				}
			}
		}
		
		
		//第二步:从所有边中取出组成最小生成树的边
		//1.找到算法结束条件
		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;
	      
		  bool nodeAIsInSet=false;
		  bool nodeBIsInSet=false;
		  
		  int nodeAInSetLabel=-1;
		  int nodeBInSetLabel=-1;
		  //4.找出点所在的点的集合
		  for(int i=0;i<nodeSets.size();i++)
		  {
		  	nodeAIsInSet=isInSet(nodeSets[i],nodeAIndex);
		  	if(nodeAInSetLabel)
		  	{
		  		nodeAInSetLabel=i;
			}
		  }
		  
		  for(int i=0;i<nodeSets.size();i++)
		  {
		  	nodeBIsInSet=isInSet(nodeSets[i],nodeBIndex);
		  	if(nodeBIsInSet)
		  	{
		  		nodeBInSetLabel=i;
			}
		  }
		  
		  //5.根据点的所在集合的不同做出不同的处理
		  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)
		  {
		  	nodeSets[nodeBInSetLabel].push_back(nodeAIndex);
		  }
		  
		  else if(nodeAInSetLabel!=-1&&nodeBInSetLabel==-1)
		  {
		  	nodeSets[nodeAInSetLabel].push_back(nodeBIndex);
		  }
		  
		  else 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];
			}
		  }
		  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;
     	}
    }   

bool CMap::isInSet(vector<int> nodeSet,int target)
{
	for(int i=0;i<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]);
	}
}


正在回答

3 回答

kruskalTree() 这个函数里while()循环中第一个for()循环中的if()语句判断 把 nodeAInSetLabel 换成 nodeAIsInSet

你这个地方写错了

0 回复 有任何疑惑可以回复我~

同问也是这个问题

0 回复 有任何疑惑可以回复我~

设置邻接矩阵的时候出错了吧

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

克鲁斯卡尔算法输出结果为何出现这样的错误呢

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信