图论-环的检测
对于最短路径貌似还有很多的算法.先暂且搁置一边,看看图论中环的检测.
思想: 利用深度优先遍历.
图式 如下:
主要代码:
/************************************************************************/
/* 函数功能:环的检测
参数说明: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,以数值的方式来判定,较后面对应的数值将会越大