java数据结构----图的遍历应用举例:编程实现应用广度优先搜索算法确定无向图的连通分量

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

图的遍历应用举例1

题目:编程实现应用广度优先搜索算法确定无向图的连通分量,即:图有几个互不相连的部分

其中,涉及到:接口 IGraph 和类 MGraph 详见博文图的存储结构之邻接矩阵

当然也可以访问我的github,获取完整项目代码(注:更新有延迟),地址见博文开头

package code.Graph;

import code.Queue.LinkQueue;

/**
 * 图的遍历方法应用举例1
 *
 * 题目:
 *      编程实现应用广度优先搜索算法确定无向图的连通分量(即:有几个互不相连的部分)
 * */
public class GraphSearchExample1 {
    public final static int INFINITY = Integer.MAX_VALUE;

    public static void CC_BFS(IGraph G)throws Exception{
        boolean [] visited = new boolean[G.getVexNum()];//实例化访问标志数组

        for (int v = 0;v < G.getVexNum();v++){//循环 顶点次数 次
            //将访问标志数组初始化
            visited[v] = false;
        }

        LinkQueue Q = new LinkQueue();//辅助队列Q
        LinkQueue P = new LinkQueue();//辅助队列P,用于记录连通分量的顶点
        int i = 0;  //用于记录连通分量的个数
        for (int v = 0;v < G.getVexNum();v++){//循环顶点数次
            P.clear();  //队列清空
            if (!visited[v]){   //如果某个顶点没有被访问到
                visited[v] = true;  //设置为已经访问
                P.offer(G.getVex(v));   //将图的第v个节点入队
                Q.offer(v);     //v入队列

                while (!Q.isEmpty()){
                    int u = (Integer)Q.poll();//队首元素出队列并赋值给u

                    for (int w = G.firstAdjVex(u);w >= 0;w = G.nextAdjVex(u,w)){
                        if (!visited[w]){   //w为u的尚未访问的邻接顶点
                            visited[w] = true;

                            P.offer(G.getVex(w));

                            Q.offer(w);
                        }
                    }
                }

                System.out.println("图的第"+ ++i + "个连通分量是:");
                while (!P.isEmpty()){
                    System.out.print(P.poll().toString()+" ");
                }
                System.out.println();
            }
        }


    }

    public static void main(String [] args)throws Exception{

        /**
         * 定义一个图,大约长这样:
         *              A
         *            |  \            E
         *           B    \          |
         *           \    D          F
         *            \  |          |
         *              C          G
         *
         * */

        Object vexs[] = {"A","B","C","D","E","F","G"};
        int [][] arcs = {
                {0, 1, INFINITY, 1, INFINITY, INFINITY, INFINITY},
                {1, 0, 1, INFINITY, INFINITY, INFINITY, INFINITY},
                {INFINITY, 1, 0, 1, INFINITY, INFINITY, INFINITY},
                {1, INFINITY, 1, 0, INFINITY, INFINITY, INFINITY},
                {INFINITY, INFINITY, INFINITY, INFINITY, 0, 1, INFINITY},
                {INFINITY, INFINITY, INFINITY, INFINITY, 1, 0, 1},
                {INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, 1, 0}
        };

        MGraph G = new MGraph(GraphKind.UDG,7,6,vexs,arcs);
        CC_BFS(G);
        /**
         * 输出:
         *    图的第1个连通分量是:
         *    A B D C
         *    图的第2个连通分量是:
         *    E F G
         * */
    }

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