java数据结构----图的遍历应用举例:编程实现应用深度优先搜索策略判断一个有向图是否存在环

数据结构系列是我学习做的笔记,会持续更新,源码分享在github:数据结构,当然你也可以从下面的代码片中获取
注:github代码更新会有延迟,关注不迷路😄

图的遍历应用举例3

题目:编程实现应用深度优先搜索策略判断一个有向图是否存在环

其中,涉及到:接口 IGraph 和类 ALGraph 详见博文图的存储结构之邻接表
当然也可以访问我的github,获取完整项目代码(注:更新有延迟),地址见博文开头

package code.Graph;

import code.Stack.LinkStack;

/**
 * 图的遍历方法应用举例3
 *
 * 题目:
 *      编程实现应用深度优先搜索策略判断一个有向图是否存在环
 * */
public class GraphSearchExample3 {
    private boolean [] visited; //访问标志数组

    //按照深度优先搜索访问的先后顺序记录在一个连通分支当中的顶点元素
    private LinkStack S = new LinkStack();

    private boolean find = false;   //记录是否已经找到了环

    public void findCircle(IGraph G)throws Exception{
        visited = new boolean[G.getVexNum()];
        for (int w = 0;w<G.getVexNum();w++){
            //访问数组初始化
            visited[w] = false;
        }
        for (int v = 0;v<G.getVexNum();v++){
            if (!visited[v]){   //对尚未访问的顶点调用DFS
                findDFS(G,v);
            }
        }

        if (find){
            System.out.println("此图存在环");
        }else {
            System.out.println("此图不存在环!");
        }
    }

    public void findDFS(IGraph G,int v)throws Exception{
        if (!find){
            visited[v] = true;
            S.push(v);

            for (int w = G.firstAdjVex(v);w>=0;w = G.nextAdjVex(v,w)){
                if (visited[w]&&isDuplicate(w)){
                    find = true;
                }else {
                    //对v尚未访问的邻接顶点w递归调用DFS
                    findDFS(G,w);
                }
            }
            S.pop();
        }
    }

    /**
     * 判断栈S中是否存在值为w的数据元素
     * */
    private boolean isDuplicate(Integer w)throws Exception{
        LinkStack S1 = new LinkStack(); //辅助栈
        while (!S.isEmpty()&&!((Integer)S.peek()).equals(w)){
            //利用辅助栈S1记录出栈的数据元素
            S1.push(S.pop());
        }
        if (S.isEmpty()){   //重新把数据元素放入栈S中
            while (!S1.isEmpty()){
                S.push(S1.pop());
            }
            return false;
        }else {
            return true;
        }
    }
    
	public static ALGraph getGraphSearch_G(){
        /*
         * 构建一个有向图
         * 其中:
         *
         *       A--->B--->C--->D--->E-->F--->A
         *
         *       F--->B--->E
         *
         * */

        ArcNode ab = new ArcNode(1);
        VNode A = new VNode("A",ab);

        ArcNode bc = new ArcNode(2);
        ArcNode be = new ArcNode(4,0,bc);
        VNode B = new VNode("B",be);

        ArcNode cd = new ArcNode(3);
        VNode C = new VNode("C",cd);

        ArcNode de = new ArcNode(4);
        VNode D = new VNode("D",de);

        ArcNode ef = new ArcNode(5);
        VNode E = new VNode("E",ef);

        ArcNode fa = new ArcNode(0);
        ArcNode fb = new ArcNode(1,0,fa);
        VNode F = new VNode("F",fb);

        VNode [] vexs = {A,B,C,D,E,F};
        return new ALGraph(GraphKind.DG,6,8,vexs);
    }

    public static void main(String [] args)throws Exception{
        GraphSearchExample3 test = new GraphSearchExample3();
        test.findCircle(GraphSearchExample3.getGraphSearch_G());
    }

}
发布了27 篇原创文章 · 获赞 49 · 访问量 2256
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章