完整演示代码

124 篇文章 0 订阅
120 篇文章 0 订阅
public class GraphDemo {
    public static void main(String[] args) {
        String[] s = {"A","B","C","D","E","F","G"};
        Graph graph = new Graph(s);
        //A-B A-C A-G A-F F-D F-E D-E E-G
        graph.connect(0, 1);
        graph.connect(0, 2);
        graph.connect(0, 6);
        graph.connect(0, 5);
        graph.connect(5, 3);
        graph.connect(5, 4);
        graph.connect(3, 4);
        graph.connect(4, 6);
        graph.showGraphMatrix();

        graph.dsf();//A -> B -> C -> F -> D -> E -> G -> 
        System.out.println();
        graph.bfs();//A -> B -> C -> F -> G -> D -> E -> 
    }
}

//图形结构
class Graph {
    //存储图中所有顶点
    private List<String> vertexes;
    //图形结构的邻接矩阵
    private int[][] matrix;
    //各顶点访问情况,true为已访问,false为未访问
    private boolean[] visited;

    /**
     * 根据传入的顶点信息生成矩阵
     * @param s
     */
    public Graph(String s[]) {
        vertexes = new ArrayList<>();
        for (String vertex : s){
            vertexes.add(vertex);
        }
        matrix = new int[s.length][s.length];
    }

    /**
     * 将俩个顶点连接,即生成边
     * @param index1 顶点在集合中的索引
     * @param index2
     */
    public void connect(int index1, int index2){
        if (index1 < 0 || index1 > matrix.length || index2 < 0 || index2 > matrix.length){
            throw new RuntimeException("该顶点未存在");
        }
        //将新的邻接添加的邻接矩阵中
        matrix[index1][index2] = 1;
        matrix[index2][index1] = 1;
    }

    /**
     * 展示邻接矩阵
     */
    public void showGraphMatrix(){
        for (int arr[] : matrix){
            System.out.println(Arrays.toString(arr));
        }
    }

    public void dsf(){
        visited = new boolean[vertexes.size()];
        //以在集合中下标为0的顶点,进行深度优先搜索
        dsf(visited, 0);
    }

    /**
     * 深度优先搜索
     * @param visited
     * @param row
     */
    public void dsf(boolean[] visited, int row){
        //输出当前顶点
        System.out.print(vertexes.get(row) + " -> ");
        //将当前顶点设为已访问
        visited[row] = true;
        //获取当前顶点的邻接顶点下标
        int index = getFirstNeighbor(row);
        //如果当前顶点有邻接顶点则进行深度搜索
        while (index != -1){
            //当邻接顶点未访问时,则递归遍历
            if (visited[index] != true){
                dsf(visited, index);
            }
            //当邻接顶点已访问时,则寻找另一个邻接顶点
            index = getNeighbor(row, index);
        }
    }

    public void bfs(){
        visited = new boolean[vertexes.size()];
        以在集合中下标为0的顶点,进行广度优先搜索
        bfs(visited, 0);
    }

    /**
     * 广度优先搜索
     * @param visited
     * @param row
     */
    public void bfs(boolean[] visited, int row){
        //创建队列,存储遍历邻接顶点的顺序
        Queue queue = new ArrayDeque();
        //输出当前顶点
        System.out.print(vertexes.get(row) + " -> ");
        //将当前顶点设为已访问
        visited[row] = true;
        //将当前顶点加入队列中
        queue.add(row);
        //当队列不为空时,即有未搜索的邻接顶点,进行搜索
        while (!queue.isEmpty()){
            //按顺序从队列中弹出邻接顶点下标
            int last = (Integer)queue.poll();
            //获取该弹出顶点的邻接顶点下标
            int index = getFirstNeighbor(last);
            //当弹出顶点有邻接顶点时,进行广度搜索
            while(index != -1){
                //当邻接顶点未访问时
                if(visited[index] != true){
                    //输出该邻接顶点
                    System.out.print(vertexes.get(index) + " -> ");
                    //把该邻接顶点设为已访问
                    visited[index] = true;
                    //将该邻接顶点加入队列
                    queue.add(index);
                }
                //继续寻找弹出顶点的另一个邻接顶点
                index = getNeighbor(last, index);
            }
        }
    }

    /**
     * 获取顶点在邻接矩阵对应行row中的第一个邻接顶点下标
     * @param row
     * @return 当有邻接顶点时返回邻接顶点下标,没有则返回-1
     */
    public int getFirstNeighbor(int row){
        for(int i =0; i<matrix.length; i++){
            if (matrix[row][i] != 0){
                return i;
            }
        }
        return -1;
    }

    /**
     * 获取顶点在邻接矩阵对于行row中col列的下一个邻接顶点
     * @param row
     * @param col
     * @return 当有邻接顶点时返回邻接顶点下标,没有则返回-1
     */
    public int getNeighbor(int row, int col){
        for (int i=col+1; i<matrix.length; i++){
            if (matrix[row][i] != 0){
                return i;
            }
        }
        return -1;
    }
}
对任意给定的图(顶点数不小于20,边数不少于30,图的类型可以是有向图、无向图、有向网、无向网),能够输入图的顶点和边(或弧)的信息,并存储到相应存储结构(邻接矩阵、邻接表、十字链表、邻接多重表,任选其中两种类型),对自己所创建的图完成以下操作: 对无向图求每个顶点的度,或对有向图求每个顶点的入度和出度(5分) 完成插入顶点和边(或弧)的功能(5分) 完成删除顶点和边(或弧)的功能(5分) 两种存储结构的转换(5分),如果其中一种存储结构为十字链表或邻接多重表则增加5分。 输出图的深度优先遍历序列或广度优先遍历序列(5分) 求图的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历(15分) 判断图的连通性,输出连通分量的个数(5分) 判断图中是否存在环,无向图5分,有向图10分 给出顶点u和v,判断u到v是否存在路径(5分) 10、求顶点u到v的一条简单路径(10分) 11、求顶点u到v的所有简单路径(15分) 12、求顶点u到v的最短路径(10分) 13、求顶点u到其余各顶点的最短路径(15分) 14、求任两个顶点之间的最短路径(15分) 15、求最小生成树(15分) 16、对于有一个源点和一个汇点的有向网,求关键路径(20分) 编程环境可以是C、VC++、JAVA,每位同学从上述题目中选择100分的题目,注意,必须选择第1-6题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值