最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442

SEO技术关于有向图、无向图是否有环的判断

日期:06-05    来源:中国设计秀    作者:cnwebshow.com

 温馨提示:环的判断算法可能是蜘蛛进行一些链接作弊识别的算法有着相同的思想,比如链轮识别等,可能就是采用了类似下面的算法思维。z7k中国设计秀

今天在做数据库的调度冲突可串行性判别的程序,中间要用到有向图中环判定的问题,特摘录如下。这些算法和思想都是来自网上的,在此感谢原作者!z7k中国设计秀

先介绍一下无向图的判断算法,这个比较简单:z7k中国设计秀

判断无向图中是否存在回路(环)的算法描述z7k中国设计秀

如果存在回路,则必存在一个子图,是一个环路。环路中所有顶点的度>=2。z7k中国设计秀

算法:z7k中国设计秀

第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。z7k中国设计秀

第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。z7k中国设计秀

如果最后还有未删除顶点,则存在环,否则没有环。z7k中国设计秀

算法分析:z7k中国设计秀

由于有m条边,n个顶点。如果m>=n,则根据图论知识可直接判断存在环路。z7k中国设计秀

(证明:如果没有环路,则该图必然是k棵树 k>=1。根据树的性质,边的数目m = n-k。k>=1,所以:m<n)z7k中国设计秀

如果m<n 则按照上面的算法每删除一个度为0的顶点操作一次(最多n次),或每删除一个度为1的顶点(同时删一条边)操作一次(最多m次)。这两种操作的总数不会超过m+n。由于m<n,所以算法复杂度为O(n)z7k中国设计秀

接下来介绍有向图是否有环的判定算法,主要有深度优先和拓扑排序2中方法。z7k中国设计秀

1、拓扑排序,如果能够用拓扑排序完成对图中所有节点的排序的话,就说明这个图中没有环,而如果不能完成,则说明有环。z7k中国设计秀

2、可以用Strongly Connected Components来做,我们可以回忆一下强连通子图的概念,就是说对于一个图的某个子图,该子图中的任意u->v,必有v->u,则这是一个强连通子图。这个限定正好是环的概念。所以我想,通过寻找图的强连通子图的方法应该可以找出一个图中到底有没有环、有几个环。z7k中国设计秀

3、就是用一个改进的DFSz7k中国设计秀

刚看到这个问题的时候,我想单纯用DFS就可以解决问题了。但细想一下,是不能够的。如果题目给出的是一个无向图,那么OK,DFS是可以解决的。但无向图得不出正确结果的。比如:A->B,A->C->B,我们用DFS来处理这个图,我们会得出它有环,但其实没有。z7k中国设计秀

我们可以对DFS稍加变化,来解决这个问题。解决的方法如下:z7k中国设计秀

图中的一个节点,根据其C[N]的值,有三种状态:z7k中国设计秀

0,此节点没有被访问过z7k中国设计秀

-1,被访问过至少1次,其后代节点正在被访问中z7k中国设计秀

1,其后代节点都被访问过。z7k中国设计秀

按照这样的假设,当按照DFS进行搜索时,碰到一个节点时有三种可能:z7k中国设计秀

1、如果C[V]=0,这是一个新的节点,不做处理z7k中国设计秀

2、如果C[V]=-1,说明是在访问该节点的后代的过程中访问到该节点本身,则图中有环。z7k中国设计秀

3、如果C[V]=1,类似于2的推导,没有环。 在程序中加上一些特殊的处理,即可以找出图中有几个环,并记录每个环的路径z7k中国设计秀

上面这个算法我没看懂。。所以没实现,但是自己用DFS实现了环检测。z7k中国设计秀

  // DFS,发现回路(返回true)则不可序列化,返回false z7k中国设计秀
    for (int i = 1; i <= n; i++) { z7k中国设计秀
        if (dfsCheckCircuit(i)) z7k中国设计秀
            return false; z7k中国设计秀
    } z7k中国设计秀
 z7k中国设计秀
// 如果发现回路则返回true,否则遍历结束返回false z7k中国设计秀
private boolean dfsCheckCircuit(int current) { z7k中国设计秀
    if (walked[current]) { z7k中国设计秀
        return true; z7k中国设计秀
    } z7k中国设计秀
    walked[current] = true; z7k中国设计秀
    for (int i = 1; i <= n; i++) z7k中国设计秀
        if (digraph[current][i]) { z7k中国设计秀
            if (dfsCheckCircuit(i)) { z7k中国设计秀
                return true; z7k中国设计秀
            } z7k中国设计秀
        } z7k中国设计秀
    walked[current] = false; z7k中国设计秀
    return false; z7k中国设计秀
}  z7k中国设计秀

本文引用地址:/site/article_72430.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明