Java数据结构之图的领接矩阵详解

 更新时间:2021年11月30日 16:50:34   作者:    
图的领接矩阵存储方式是用两个数组来表示图。一个一位数组存储图中顶点信息,一个二维数组存储图中的边或弧的信息。本文将为大家重点介绍一下数据结构中的图的邻接矩阵,快来跟随小编一起学习吧

1.图的领接矩阵(Adjacency Matrix)存储结构

图的领接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一位数组存储图中顶点信息,一个二维数组(称为领接矩阵)存储图中的边或弧的信息。

举例

无向图

无向图的领接矩阵的第i行或第i列的非零元素个数正好是第i个顶点的度。

有向图

有向图的领接矩阵的第i行的非零元素个数正好是第i个顶点的出度,第i列的非零元素个数正好是第i个顶点的入度。

带权值的网图

2.图的接口类

3.图的类型,用枚举类表示

public enum GraphKind {
    UDG,DG,UDN,DN;//无向图、有向图、无向网、有向网
}

4.图的领接矩阵描述

对于一个具有n个顶点的图G,可以将图G的领接矩阵存储在一个二维数组中.

package Graph;
/*
    图的领接矩阵描述类
 */
import java.util.Scanner;
 
public class MyGraph implements IGraph {
    public final static int INFINITY = Integer.MAX_VALUE;
    private GraphKind kind;             //图的标志
    private int vexNum, arcNum;          //图当前顶点和边数
    private Object[] vexs;              //顶点
    private int[][] arcs;               //邻接矩阵
 
    public MyGraph() {                  //空参构造
        this(null, 0, 0, null, null);
    }
 
    public MyGraph(GraphKind kind, int vexNum, int arcNum, Object[] vexs, int[][] arcs) {   // 实参构造
        this.kind = kind;
        this.vexNum = vexNum;
        this.arcNum = arcNum;
        this.vexs = vexs;
        this.arcs = arcs;
    }
 
    @Override
    public void createGraph() {               //创建新图
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图的类型:");
        GraphKind kind = GraphKind.valueOf(sc.next());
        switch (kind) {
            case UDG:
                createUDG();
                return;
            case DG:
                createDG();
                return;
            case UDN:
                createUDG();
                return;
            case DN:
                createDN();
                return;
 
        }
    }
 
    private void createUDG() {       //创建无向图
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图的顶点数、图的边数:");
        vexNum = sc.nextInt();
        arcNum = sc.nextInt();
        vexs = new Object[vexNum];
        System.out.println("请分别输入图的各个顶点");
        for (int v = 0; v < vexNum; v++)                //构造顶点函数
            vexs[v] = sc.next();
        arcs = new int[vexNum][vexNum];
        for (int v = 0; v < vexNum; v++)
            for (int u = 0; u < vexNum; u++)
                arcs[v][u] = INFINITY;              //初始化领接矩阵
        System.out.println("请输入各个边的两个顶点及其权值:");
        for (int k = 0; k < arcNum; k++) {
            int v = locateVex(sc.next());
            int u = locateVex(sc.next());
            arcs[v][u] = arcs[v][u] = sc.nextInt();
        }
    }
    private void createDG() {       //创建有向图
    }
    ;
 
    private void createUDN() {       //创建无向网
 
    }
    private void createDN() {           //创建有向网
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图的顶点数、图的边数:");
        vexNum = sc.nextInt();
        arcNum = sc.nextInt();
        vexs = new Object[vexNum];
        System.out.println("请分别输入图的各个顶点");
        for (int v = 0; v < vexNum; v++)                //构造顶点函数
            vexs[v] = sc.next();
        arcs = new int[vexNum][vexNum];
        for (int v = 0; v < vexNum; v++)
            for (int u = 0; u < vexNum; u++)
                arcs[v][u] = INFINITY;              //初始化领接矩阵
        System.out.println("请输入各个边的两个顶点及其权值:");
        for (int k = 0; k < arcNum; k++) {
            int v = locateVex(sc.next());
            int u = locateVex(sc.next());
            arcs[v][u] = sc.nextInt();
        }
    }
    @Override
    public int getVexNum() {
        return vexNum;   //返回顶点数
    }
 
    @Override
    public int getArcNum() {
        return arcNum;      //返回边数
    }
 
    @Override              //返回v的第一个领接点,若v没有领接点返回-1;
    public Object getVex(int v) throws Exception {
        if (v < 0 && v >= vexNum)
            throw new Exception("第" + v + "个顶点不存在!");
        return vexs[v];
          <0v<vexNum
    }
 
    @Override
    public int locateVex(Object vex) {          //顶点定位法
 
        for (int v = 0; v < vexNum; v++)
            if (vexs[v].equals(vex))
                return v;
        return 0;
    }
 
    @Override                            
    public int firstAdjVex(int v) throws Exception {   //查找第一个领接点
        if (v < 0 && v >= vexNum)
            throw new Exception("第" + v + "个顶点不存在!");
        for (int j = 0; j < vexNum; j++)
            if (arcs[v][j] != 0 && arcs[v][j] < INFINITY)
                return j;
                return -1;
    }
 
    
    @Override
    public int nextAdjvex(int v, int w) {         //查找下一个领接点
        return 0;
    }
    public GraphKind getKind(){                   //返回图标类型
        return kind;
    }
 
  
    public int[][] getArcs() {              //返回邻接矩阵的值
        return arcs;
    }
 
                                            //返回顶点
    public Object[] getVexs() {
        return vexs;
    }
}

测试类

    public static void main(String[] args) throws Exception {
        MyGraph M=new MyGraph();                                //创建图空间
        M.createGraph();
        System.out.println("创建无向网的顶点个数为:"+M.getVexNum());
        System.out.println("创建无向网的边个数为:"+M.getArcNum());
        System.out.println("请输入要查找顶点的值:");
        Scanner sc=new Scanner(System.in);                  
        Object top=sc.next();
        System.out.println("要查找顶点"+top+"的值为:"+ M.locateVex(top));
        System.out.println("请输入要查找顶点的索引:");
        int x= sc.nextInt();
        System.out.println("要查找位置"+x+"处的顶点值为:"+M.getVex(x) );
        System.out.println("请输入邻接点的顶点的位置:");
        int n= sc.nextInt();
        System.out.println("要查找位置"+n+"处的顶点值为:"+M.firstAdjVex(n) );
    }
}

结果

以上就是Java数据结构之图的领接矩阵详解的详细内容,更多关于Java数据结构资料请关注脚本之家其它相关文章!

相关文章

  • maven项目不编译xml文件问题

    maven项目不编译xml文件问题

    这篇文章主要介绍了maven项目不编译xml文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • java秒杀之redis限流操作详解

    java秒杀之redis限流操作详解

    这篇文章主要为大家详细介绍了java秒杀之redis限流操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java锁升级的实现过程

    Java锁升级的实现过程

    这篇文章主要介绍了Java锁升级的实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 利用Log4j将不同Package的日志输出到不同文件的方法

    利用Log4j将不同Package的日志输出到不同文件的方法

    日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。这篇文章主要介绍了利用Log4j将不同Package的日志输出到不同文件的方法,需要的朋友可以参考借鉴,下面来跟着小编一起学习学习吧。
    2017-01-01
  • Java System.exit()退出程序方式

    Java System.exit()退出程序方式

    这篇文章主要介绍了Java System.exit()退出程序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Spring @ExceptionHandler注解统一异常处理和获取方法名

    Spring @ExceptionHandler注解统一异常处理和获取方法名

    这篇文章主要介绍了Spring注解之@ExceptionHandler 统一异常处理和获取方法名,在实际项目中,合理使用@ExceptionHandler能够提高代码的可维护性和用户体验,通过本文的解析和实践,读者可以更好地理解和掌握@ExceptionHandler的用法和原理
    2023-09-09
  • springboot+redis+阿里云短信实现手机号登录功能

    springboot+redis+阿里云短信实现手机号登录功能

    这篇文章主要介绍了springboot+redis+阿里云短信实现手机号登录功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • 一文详解Springboot集成mybatis-plus

    一文详解Springboot集成mybatis-plus

    这篇文章主要介绍了Mybatis-Plus与SpringBoot整合,并在项目中实战运用,列举其增删改查的使用方式,对学习或工作有一定的帮助,需要的小伙伴可以参考阅读
    2023-04-04
  • 使用自定义注解实现加解密及脱敏方式

    使用自定义注解实现加解密及脱敏方式

    这篇文章主要介绍了使用自定义注解实现加解密及脱敏方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 带你全面认识Java中的异常处理

    带你全面认识Java中的异常处理

    在你所写过的代码中,你已经接触过一些异常了,我们可以通过一些简单的代码让我们理解一些简单的异常,下面这篇文章主要给大家介绍了关于Java中异常处理的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12

最新评论