📄 subject_67322.htm
字号:
<p>
序号:67322 发表者:wangyy 发表日期:2003-12-30 22:51:41
<br>主题:请教算法:判断有向图是否有环(数据存储用十字链表)
<br>内容:请教算法:判断有向图是否有环(数据存储用十字链表)
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2003-12-31 10:13:00
<br>内容:深度遍历,在已经遍历的节点上做上标记,如果遍历到做过标记的节点就是有环
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wangyy 回复日期:2004-01-01 11:01:58
<br>内容:算法应该是可以的,但是好像存在不少问题,代码如下:<BR><BR>BOOL CDiGraph::ExistCycle()<BR>{//存在环?<BR> ResetVisit(FALSE);<BR> for(int i=0;i<m_lTotalNodes;i++)<BR> {<BR> if ExistCycleDFS(i);<BR> return TRUE;<BR> else<BR> {<BR> ResetVisit(FAlSE);//为下一次的遍历做好准备<BR><BR> }<BR> }<BR> return FALSE;<BR><BR>}<BR><BR>BOOL CDiGraph::ExistCycleDFS(long node)<BR>{//本算法在确保原始所有节点都未访问的前提才有效<BR> m_arrData[node].SetVisit();<BR> CDiGraphEdge * pEdge=m_arrData[node].GetFirstOutEdge();<BR> while (pEdge)<BR> {<BR> if(!m_arrData[pEdge->m_pSecondNode].IsVisited())<BR> {<BR> return ExistCycleDFS(pEdge->m_pSecondNode);<BR> }<BR> else<BR> {<BR> ResetVisit(TRUE);//停止搜索,复位反问标志<BR> return TRUE;<BR><BR> }<BR> pEdge=pEdge->GetNextEdgeOfFirstNode();<BR> }<BR> return FALSE;<BR><BR>}<BR>因为是递归算法,当有环返回时,不能直接返回,还要经过多次返回。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:平平淡淡 回复日期:2004-01-02 10:26:42
<br>内容:同意, 第1楼 回复于2003-12-31 10:13:00 <BR>--------------------------------------------------------------------------------<BR><BR>深度遍历,在已经遍历的节点上做上标记,如果遍历到做过标记的节点就是有环 <BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2004-01-02 10:54:48
<br>内容:存在不少问题是什么问题<BR>你那个是伪代码吗?<BR>if ExistCycleDFS(i);应该编译不通过才是啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wangyy 回复日期:2004-01-03 15:56:52
<br>内容:ExistCycleDFS(i)不是已经定义在上面吗?存在问题:有环无法直接返回,而且返回时重复调用ResetVisit(TRUE),效率非常低。我已经把上面的程序改写为非递归程序,以上问题就解决了。BOOL CDiGraph::ExistCycle()<BR>{//存在环?<BR> ResetVisit(FALSE);<BR> for(int i=0;i<m_lTotalNodes;i++)<BR> {<BR> if ExistCycleDFS(i);<BR> return TRUE;<BR> else<BR> {<BR> ResetVisit(FAlSE);//为下一次的遍历做好准备<BR><BR> }<BR> }<BR> return FALSE;<BR><BR>}<BR><BR>BOOL CDiGraph::ExistCycleDFS(long node)<BR>{//本算法在确保原始所有节点都未访问的前提才有效<BR>//本算法通过普通深度遍历递归程序改写<BR>//////////////////////////////////////<BR> stack<long> pa;<BR> stack<long> label;<BR> pa.push(node);<BR> label.push(2);//<BR>//////////////////////////////////////<BR>t0: m_arrData[pa.top].SetVisit();<BR> CDiGraphEdge * pEdge=m_arrData[pa.top()].GetFirstOutEdge();<BR> while (pEdge)<BR> {<BR> if(!m_arrData[pEdge->m_pSecondNode].IsVisited())<BR> {<BR> //ExistCycleDFS(pEdge->m_pSecondNode,result);<BR> pa.push(pEdge->m_pSecondNode);<BR> label.push(1);<BR> goto t0; <BR>t1: pa.pop();<BR> label.pop();<BR> }<BR> else<BR> {<BR> return TRUE;<BR> }<BR> pEdge=pEdge->GetNextEdgeFromFirstNode();<BR> }<BR> //模拟递归出口<BR> switch (label.top())<BR> {<BR> case 0:<BR> goto t0;<BR> case 1:<BR> goto t1;<BR> case 2:<BR> goto t2;<BR> };<BR>//////////////////////////////////////<BR>t2: pa.pop();<BR> label.pop();<BR> return FALSE;<BR>//////////////////////////////////////<BR><BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wangyy 回复日期:2004-01-09 08:39:44
<br>内容:对于上面的代码改写不知有没问题?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2004-01-09 13:24:11
<br>内容:goto太多,看不清楚了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wangyy 回复日期:2004-01-10 22:08:00
<br>内容:我的问题是以上的goto 语句和标号语句用法不知对不对,因为while(){}是一个整体语句,不知道c++中goto 语句能否goto到while整体语句的内部某条子语句,能否如此应用?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2004-01-12 18:38:28
<br>内容:我们不用goto的说
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:RoBin Luo 回复日期:2004-01-25 21:04:06
<br>内容:agree!<BR>I hate goto so much!<BR>高手你写那么多goto不是故意来让我们头痛的吧?<BR>还有想让人看注释的多写的吧?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:RoBin Luo 回复日期:2004-01-25 21:10:45
<br>内容:顺便说一声好象C++里goto是不允许跳进循环体的吧?<BR>哎,晕的我啊~
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wangyy 回复日期:2004-01-25 22:59:05
<br>内容:误解我了!我认为这个方法可以避免递归,提高效率,以上是按照“数据结构课程”里面介绍的方法改编的。我现在就怀疑goto的用法有错,不知如何修正。请大家一定帮帮忙。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wangyy 回复日期:2004-02-08 10:35:28
<br>内容:林建华:帮帮忙
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2004-02-12 13:51:57
<br>内容:避免递归的方法是用堆栈
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wangyy 回复日期:2004-02-12 19:46:26
<br>内容:是呀,我是建立了一个人工堆栈。可是不知道如何消除go to.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:林建华 回复日期:2004-02-13 10:04:06
<br>内容:goto实际上都可以用for,continue,break来代替的,你写代码的时候要先把流程想清楚,再写,这样结构就清楚多了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wangyy 回复日期:2004-02-14 20:19:06
<br>内容:谢谢林建华。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -