Fork me on GitHub

数据结构——图的邻接矩阵创建(java版本)

邻接矩阵的概念:

所谓邻接矩阵,就是用两个数组来表示图的相关信息,其中用一个一维的顶点数组来表示图的顶点信息,用一个二维的边数组来表示图的边或者弧信息。 

如下图是一个无向图的邻接矩阵表示,两个顶点之间若联通则二维数组对应位置为1,否则为0。

 下图是一个有向图的邻接矩阵表示。

 下图是一个带权值的有向图(又称为有向网)的邻接矩阵表示,两个顶点之间若连通则二维数组      对应位置为边上的权值,否则为无穷大,并且二维矩阵的对角线为0(当然也可以设置为无穷大)

 代码部分:

 该代码用一个类去实现邻接矩阵,其中类中含有一个一维顶点数组和一个二维边数组字段,并且   包含无向图、有向图、带权值的无向图(无向网)、带权值的有向图(有向网)的创建方法

public class MGraph01 {
    public int numNodes;      //图的顶点数目
    public int numEdges;      //图的边数
    public Object[] vexs;     //一维顶点数组
    public int[][] arcs;      //二维边数组
    public static final int INF = Integer.MAX_VALUE; //无穷大

    /**
     * 创建无向图的邻接矩阵
     */
    public void createUDG() {
        Scanner sc = null;
        try {
            sc = new Scanner(System.in);
            System.out.println("请输入图的顶点数、图的边数:");
            numNodes = Integer.parseInt(sc.nextLine());
            numEdges = Integer.parseInt(sc.nextLine());
            vexs = new Object[numNodes];
            //录入顶点信息
            System.out.println("请输入图中的顶点:");
            vexs = sc.nextLine().split(" ");
            //录入边的信息
            arcs = new int[numNodes][numNodes];
            for (int i = 0; i < numEdges; i++) {
                System.out.println("请输入第" + (i + 1) + "条边上的一个顶点:");
                //locate方法用来定位某个顶点在数组中的索引
                int index1 = locate(sc.nextLine());
                System.out.println("请输入第" + (i + 1) + "条边上的另一个顶点:");
                int index2 = locate(sc.nextLine());
                //无向图是个对称矩阵
                arcs[index1][index2] = arcs[index2][index1] = 1;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sc.close();
        }
    }

    /**
     * 创建有向图的邻接矩阵
     */
    public void createDG() {
        Scanner sc = null;
        try {
            sc = new Scanner(System.in);
            System.out.println("请输入图的顶点数、图的边数:");
            numNodes = Integer.parseInt(sc.nextLine());
            numEdges = Integer.parseInt(sc.nextLine());
            vexs = new Object[numNodes];
            //录入顶点信息
            System.out.println("请输入图中的顶点:");
            String str = sc.nextLine();
            vexs = str.split(" ");
            //录入边的信息
            arcs = new int[numNodes][numNodes];
            for (int i = 0; i < numEdges; i++) {
                System.out.println("请输入第" + (i + 1) + "条弧上的弧尾:");
                int index1 = locate(sc.nextLine());
                System.out.println("请输入第" + (i + 1) + "条弧上的弧头:");
                int index2 = locate(sc.nextLine());
                arcs[index1][index2] = 1;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sc.close();
        }
    }

    /**
     * 创建无向网的邻接矩阵
     */
    public void createUDN() {
        Scanner sc = null;
        try {
            sc = new Scanner(System.in);
            System.out.println("请输入图的顶点数、图的边数:");
            numNodes = Integer.parseInt(sc.nextLine());
            numEdges = Integer.parseInt(sc.nextLine());
            vexs = new Object[numNodes];
            //录入顶点信息
            System.out.println("请输入图中的顶点:");
            String str = sc.nextLine();
            vexs = str.split(" ");
            //矩阵初始化,有向网中
            arcs = new int[numNodes][numNodes];
            for (int i = 0; i < numNodes; i++) {
                for (int j = 0; j < numNodes; j++) {
                    arcs[i][j] = INF;
                }
            }
            //录入边的信息
            for (int i = 0; i < numEdges; i++) {
                System.out.println("请输入第" + (i + 1) + "条边上的一个顶点:");
                int index1 = locate(sc.nextLine());
                System.out.println("请输入第" + (i + 1) + "条边上的另一个顶点:");
                int index2 = locate(sc.nextLine());
                System.out.println("请输入第" + (i + 1) + "条边上的权值:");
                arcs[index1][index2] = arcs[index2][index1] = Integer.parseInt(sc.nextLine());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sc.close();
        }
    }

    /**
     * 创建有向网的邻接矩阵
     */
    public void createDN() {
        Scanner sc = null;
        try {
            sc = new Scanner(System.in);
            System.out.println("请输入图的顶点数、图的边数:");
            numNodes = Integer.parseInt(sc.nextLine());
            numEdges = Integer.parseInt(sc.nextLine());
            vexs = new Object[numNodes];
            //录入顶点信息
            System.out.println("请输入图中的顶点:");
            String str = sc.nextLine();
            vexs = str.split(" ");
            //录入边的信息
            arcs = new int[numNodes][numNodes];
            for (int i = 0; i < numEdges; i++) {
                System.out.println("请输入第" + (i + 1) + "条弧上的弧尾:");
                int index1 = locate(sc.nextLine());
                System.out.println("请输入第" + (i + 1) + "条弧上的弧头:");
                int index2 = locate(sc.nextLine());
                System.out.println("请输入第" + (i + 1) + "条弧上的权值:");
                arcs[index1][index2] = Integer.parseInt(sc.nextLine());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sc.close();
        }
    }

    /**
     * 通过顶点信息来定位其在顶点数组中的索引
     *
     * @param s
     * @return
     */
    public int locate(Object s) {
        for (int i = 0; i < vexs.length; i++) {
            if (s.equals(vexs[i])) {
                return i;
            }
        }
        return -1;
    }
}

 

posted @ 2021-08-04 13:47  乐派cyh  阅读(926)  评论(0编辑  收藏  举报
1