算法-图论-环的检测

来源:互联网 发布:mac卸载google chrome 编辑:程序博客网 时间:2024/06/05 09:38

图论-环的检测

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

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

图式 如下:



主要代码:

/************************************************************************//* 函数功能:环的检测   参数说明: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 0
原创粉丝点击