算法-图论-环的检测

图论-环的检测

对于最短路径貌似还有很多的算法.先暂且搁置一边,看看图论中环的检测.

思想: 利用深度优先遍历.

图式 如下:



主要代码:

/************************************************************************/
	/* 函数功能:环的检测
	   参数说明:weightGraph 加权无向图
	             visitedNum  记录每个节点被访问到的时间
				 vNum        节点的个数
				 startPos    开始访问节点的索引
				 index       记录访问到该节点的遍历时间
				 visitedGraph 标记边访问与否
	   思路:在无向图中,访问之后,对点进行标记,且将访问的边标记为已访问。
	         在遍历的时候发现点已经在之前访问,但是与邻居之间的边却没有遍历过,说明存在着环
	*/
	/************************************************************************/
bool Graph::CycleDetectionDFS( int weightGraph[10][10],int *visitedNum,int vNum,int startPos,int index,bool visitedGraph[10][10] )
{    
	//尽管这里也是使用的是深度优先遍历,但开始并不判断是否已经访问过此节点。
	*(visitedNum+startPos)=index++;
	for (int i=0;i<vNum;i++)
	{
		if (weightGraph[startPos][i]>0)
		{
			if (*(visitedNum+i)==0)//若节点还未被访问
			{
				//将边放入已访问的边集合中
				visitedGraph[startPos][i]=visitedGraph[i][startPos]=true;
				bool bExistCycle=CycleDetectionDFS(weightGraph,visitedNum,vNum,i,index,visitedGraph);//深度优先遍历
				return bExistCycle;
			}
			else if (visitedGraph[startPos][i]==false)
			{
				return true;
			}
		}
	}
	return false;
}

/************************************************************************/
/*函数功能:有向图中环的检测
  参数说明:weightGraph    有向加权图
            visitedNum     记录每个节点被访问到的时间
	    vNum           节点的个数
            startPos       开始遍历的节点的索引
	    index          记录访问到该节点的遍历时间
*/
/************************************************************************/
bool Graph::digraphCycleDectionDFS( int weightGraph[10][10],int *visitedNum,int vNum,int startPos,int index )
{
	//有向图中与无向图不一样在于:可能遍历为
	*(visitedNum+startPos)=index++;
	for (int i=0;i<vNum;i++)
	{
		if (weightGraph[startPos][i]>0)
		{
			if (*(visitedNum+i)==0)//若还没有被访问过
			{
				bool bExistCycle=digraphCycleDectionDFS(weightGraph,visitedNum,vNum,i,index);
				return bExistCycle;
			}
			else if (*(visitedNum+i)>0)
			{
				return true;
			}
		}
	}
	return false;
}

运行结果为两种情况下都有环的存在

小结:

     1)对节点判断访问不是简单的true或者false,以数值的方式来判定,较后面对应的数值将会越大


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值