数据结构域算法设计-41.有向图的几个算法分析总结 教案

数据结构域算法设计-41.有向图的几个算法分析总结 教案

ID:33423109

大小:409.55 KB

页数:8页

时间:2019-02-25

数据结构域算法设计-41.有向图的几个算法分析总结 教案_第1页
数据结构域算法设计-41.有向图的几个算法分析总结 教案_第2页
数据结构域算法设计-41.有向图的几个算法分析总结 教案_第3页
数据结构域算法设计-41.有向图的几个算法分析总结 教案_第4页
数据结构域算法设计-41.有向图的几个算法分析总结 教案_第5页
资源描述:

《数据结构域算法设计-41.有向图的几个算法分析总结 教案》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、有向图的几个算法分析总结简介  前面讨论的很多文章里,都是针对无向图进行的分析。无向图的一个特性就是其中一旦两个节点a和b是相连的,这就意味着有路径从a到b,同时也有从b到a的。它具体对应的矩阵表达方式对应着一个对称矩阵。而这里重点是考察有向图。和无向图比起来,有向图更加多了一种出入度的概念。因为方向的有向性,很多以前在无向图里看起来比较简单的问题在这里会变得更加有意思。 有向图定义  一个常用的有向图会如下图这样:  因为每个节点和节点之间对应着一定的方向关系,所以这里用一个箭头来表示从一个节点到另外一个节点的有向关系。在具体保存有向图定义的数据结构里,我们还是

2、可以采用一样的链表组结构。只是因为是有向图,所以加入元素的时候不用考虑对称节点的问题。在实现上其实也更加简化。  下面是一个关于有向图的简单定义实现: Java代码  1.public class Digraph {  2.    private final int vertices;  3.    private int edges;  4.    private List> adj;  5.  6.    public Digraph(int vertices) {  7.        if(vertices < 0)

3、 throw new IllegalArgumentException(  8.                "Number of vertices in a Digraph must be nonnegative");  9.        this.vertices = vertices;  10.        this.edges = 0;  11.        adj = new ArrayList>();  12.        for(int i = 0; i < vertices; i++) {  13.

4、            adj.add(new LinkedList());  14.        }  15.    }  16.  17.    public void addEdge(int v, int w) {  18.        if(v < 0 

5、

6、 v >= vertices)   19.            throw new IndexOutOfBoundsException(  1.                    "vertex " + v + " not in bound.");  2.        if

7、(w < 0 

8、

9、 w >= vertices)   3.            throw new IndexOutOfBoundsException(  4.                    "vertex " + w + " not in bound.");  5.        adj.get(v).add(w);  6.        edges++;  7.    }  8.}   这部分代码很简单,无需解释。 有了这部分定义之后,我们再来考虑后面的几个典型的问题。 环的存在和检测 和前面无向图的过程有点类似,我们要检测一个图中间是否存在环,肯定

10、也需要通过某种遍历的方式,然后对访问过的元素做标记。如果再次碰到前面访问过的元素,则说明可能存在环。这里,如何来检测环和如果这个环存在的话,我们要返回这个环。在无向图的时候,这个方法确实是很简单可行,我们可以通过广度或者深度优先遍历来解决。在有向图的情况下,前面的办法照搬过来就一定可行吗? 我们来看下面的一个示例:   在该图中,假设我们从节点1开始去遍历,当按照前面的仅仅是修改marked[]数组的办法,可能先通过节点2到达节点6,于是就设定了marked[6]=true。如下图:   当再次遍历到节点6的时候,则如下图所示:  这个时候,如果去看marked[

11、6]的话,它已经被标记为true了。可是,如果按照这个条件,我们就确定这种情况存在环,肯定不行。因为现在的这个情况实际上并不是一个环,它仅仅是访问到了一个前面访问过的节点。在这种情况下,要判断一个环的存在,和取得环所在元素的问题根源在于哪里呢?  在前面的示例中,我们从节点1到2,然后到6,整个的过程里,这几个点被遍历了,但是光到这一步还没有构成一个环。按照深度优先遍历的过程,这个时候相当于2和6已经遍历完了,要去遍历节点1的另外一个边。实际上,这个时候就算从另外一个边可以遍历到前面的节点2或者6,因为这个时候能访问到2和6的是另外一组有向边了,它们和前面经过的那

12、些有向边是

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。