Java数据结构——邻接矩阵+邻接表

一、邻接矩阵

1. 定义

  • vexs[](存储顶点)和 arcs[][](存储边关系,叫邻接矩阵)集合。因此,用一个一维数组存放图中所有顶点数据;
  • 用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵
  • 无向图邻接矩阵是一个对称矩阵。
  • 用邻接矩阵表示图,很容易确定图中任意两个顶点是否有边相连。
  • 前一天的基础知识讲了:有权的图被称为网。无向图比有向图更为特殊。

2. 数据结构

  • 邻接矩阵,C语言数据结构
#define MAX_VEX 20
typedef enum {
   DG, UDG};
typedef int InfoType;
// 弧结点与矩阵的类型
typedef struct ArcCell {
   
	int adj; // 图--0,1;网--权值
	InfoType * Info; //与弧相关的信息的指针,如:权值
}ArcCell, AdjMatrix[MAX_VEX][MAX_VEX];
//  图的类型
typedef struct {
           
    char vexs[MAX_VEX]; // 顶点向量,一维矩阵 
    AdjMatrix arcs; // 邻接矩阵,二维矩阵 
    int vexnum, arcnum; // 顶点数,边数
    GraphKind kind; // 图类型
}MGraph;
  • Java代码

图的接口:(1.因为要写的数据结构较多,邻接矩阵,邻接表,十字链表,多重链表。但我们要实现的功能差不多,我们就可以把图的基本操作集成为一个接口。2.尝试多种方式开发,不拘泥。)

package graph;

/**
 * 邻接矩阵图的接口
 * 
 * @author 己千之
 * @time 2022/2/8/16:32 (tuesday)
 */
public interface IGraph {
   

	/**
	 * 获取顶点的个数
	 * 
	 * @return 顶点的个数
	 */
	int getNumOfVertex();
	
	/**
	 * 获取边的个数
	 * 
	 * @return
	 */
	int getNumOfArc();

	/**
	 * 插入顶点
	 * 
	 * @param String v
	 * @return boolean
	 */
	boolean insertVex(String v);

	/**
	 * 删除顶点
	 * 
	 * @param String v
	 * @return boolean
	 */
	boolean deleteVex(String v);

	/**
	 * 定位顶点的位置
	 * 
	 * @param String v
	 * @return 顶点的位置
	 */
	int indexOfVex(String v);

	/**
	 * 定位指定位置的顶点
	 * 
	 * @param v 顶点的位置
	 * @return E
	 */
	String valueOfVex(int v);

	/**
	 * 插入边
	 * 
	 * @param v1     顶点的位置
	 * @param v2     顶点的位置
	 * @param weight
	 * @return boolean
	 */
	boolean insertEdge(int v1, int v2, int weight);

	/**
	 * 删除边
	 * 
	 * @param v1 顶点的位置
	 * @param v2 顶点的位置
	 * @return boolean
	 */
	boolean deleteEdge(int v1, int v2);

	/**
	 * 查找边,获取权值
	 * 
	 * @param v1 顶点的位置
	 * @param v2 顶点的位置
	 * @return
	 */
	int getEdge(int v1, int v2);

	/**
	 * @深度优先搜索遍历 
	 * 从第v个顶点位置开始,深度优先搜索遍历
	 * 
	 * @param v 顶点的位置
	 * @return eg: v1->v2-v3
	 */
	void DFSTraverse();

	/**
	 * @广度优先搜索遍历 
	 * 从第v个顶点位置开始,广度优先搜索遍历
	 * 
	 * @param v 顶点的位置
	 * @return eg: v1->v2-v3
	 */
	void BFSTraverse();

	/**
	 * 查找源点到其它各个顶点的最短路径
	 * 
	 * @param v
	 * @return int[] 源点到其它各个顶点的最短路径
	 */
	public int[] dijkstra(int v);

} // IGraph

Java邻接矩阵:

package graph;

import java.util.Arrays;

/**
 * 邻接矩阵 存储图
 * 
 * @author 己千之
 * @MGraph Matrix Graph
 */
public class MGraph implements IGraph {
   

	/**
	 * @INF 无穷大 private static final int INF=Integer.MAX_VALUE;
	 */
	public static final int INF = 99; // 最大值

	/**
	 * 存储图的顶点的一维数组
	 */
	String[] vexs;

	/**
	 * 存储图的边的二维数组
	 */
	int[][] arcs;

	/**
	 * 顶点的实际数量
	 */
	int vexNum;

	/**
	 * 边数
	 */
	int arcNum;

	/**
	 * 顶点的最大数量
	 */
	int vexMax;

	/**
	 * 构造函数
	 * 
	 * @param vexMax int型
	 */
	public MGraph(int vexMax) {
   
		this.vexMax = vexMax;
		this.arcs = new int[vexMax][vexMax];
		this.vexs = new String[vexMax];
	}

	/**
	 * 构造函数
	 * 
	 * 直接传入一个矩阵,作为邻接矩阵
	 * 
	 * @param AdjMatrix
	 */
	public MGraph(int[][] AdjMatrix) {
   
		vexMax = AdjMatrix.length;

		this.arcs = new int[vexMax][vexMax];
		for (int i = 0; i < vexMax; i++) {
   
			for (int j = 0; j < vexMax; j++) {
   
				arcs[i][j] = AdjMatrix[i][j];
			}
		}

		this.vexs = new String[vexMax];
		for (int i = 0; i < vexMax; i++) {
   
			int t = i + 1;
			vexs[i] = "node" + t;
		}
	}

	/**
	 * 深度遍历
	 * 
	 * toString() arcs[][]
	 */
	public String toString() {
   
		return Arrays.deepToString(arcs);
	}

	@Override
	public int getNumOfVertex() {
   
		// 得到顶点的数目

		return this.vexNum;
	}

	@Override
	public int getNumOfArc() {
   
		// 得到边的数目
		int edgeNum = 0;
		for (int i = 0; i < vexNum; i++) {
   
			for (int j = 0; j < vexNum; j++) {
   
				if (this.arcs[i][j] != INF && arcs[i][j] != 0) {
   
					edgeNum++;
				}
			}
		}

		return edgeNum;
	}

	@Override
	public boolean insertVex(String v) {
   
		// 插入顶点

		if (
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜满月

鼓励,鼓励,更加努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值