Java编程实现邻接矩阵表示稠密图代码示例

我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法。

我们假设A是这个二维数组,那么A中的一个元素aij不仅体现出了结点vi和结点vj的关系,而且aij的值正可以表示权值的大小。

邻接矩阵模型类

邻接矩阵模型类的类名为AMWGraph.java,能够通过该类构造一个邻接矩阵表示的图,且提供插入结点,插入边,取得某一结点的第一个邻接结点和下一个邻接结点。

import java.util.ArrayList;import java.util.LinkedList;
public class AMWGraph { private ArrayList vertexList; //存储点的链表 private int[][] edges; //邻接矩阵,用来存储边 private int numOfEdges; //边的数目 public AMWGraph(int n) {  //初始化矩阵,一维数组,和边的数目  edges=new int[n][n];  vertexList=new ArrayList(n);  numOfEdges=0; } //得到结点的个数 public int getNumOfVertex() {  return vertexList.size(); } //得到边的数目 public int getNumOfEdges() {  return numOfEdges; } //返回结点i的数据 public Object getValueByIndex(int i) {  return vertexList.get(i); } //返回v1,v2的权值 public int getWeight(int v1,int v2) {  return edges[v1][v2]; } //插入结点 public void insertVertex(Object vertex) {  vertexList.add(vertexList.size(),vertex); } //插入结点 public void insertEdge(int v1,int v2,int weight) {  edges[v1][v2]=weight;  numOfEdges++; } //删除结点 public void deleteEdge(int v1,int v2) {  edges[v1][v2]=0;  numOfEdges--; } //得到第一个邻接结点的下标 public int getFirstNeighbor(int index) {  for (int j=0;j<vertexList.size();j++) {   if (edges[index][j]>0) {    return j;   }  }  return -1; } //根据前一个邻接结点的下标来取得下一个邻接结点 public int getNextNeighbor(int v1,int v2) {  for (int j=v2+1;j<vertexList.size();j++) {   if (edges[v1][j]>0) {    return j;   }  }  return -1; }}

下面再看看java编程实现邻接矩阵表示稠密图代码:

package com.dataStructure.graph;//// 稠密图 - 使用邻接矩阵表示//public class DenseGraph {////  private int n; // 节点数//  private int m; // 边数//  private boolean directed;  // 是否为有向图//  private boolean[][] g;   // 图的具体数据////  // 构造函数//  public DenseGraph(int n, boolean directed) {//    assert n >= 0;//    this.n = n;//    this.m = 0;  // 初始化没有任何边//    this.directed = directed;//    // g初始化为n*n的布尔矩阵, 每一个g[i][j]均为false, 表示没有任和边//    // false为boolean型变量的默认值//    g = new boolean[n][n];//  }////  public int V() {//    return n;//  } // 返回节点个数////  public int E() {//    return m;//  } // 返回边的个数////  // 向图中添加一个边//  public void addEdge(int v, int w) {////    assert v >= 0 && v < n;//    assert w >= 0 && w < n;////    if (hasEdge(v, w))//      return;////    // 连接 v 和 w//    g[v][w] = true;//    if (!directed)//      g[w][v] = true;////    // 边数 ++//    m++;//  }////  // 验证图中是否有从v到w的边//  boolean hasEdge(int v, int w) {//    assert v >= 0 && v < n;//    assert w >= 0 && w < n;//    return g[v][w];//  }////  // 返回图中一个顶点的所有邻边//  // 由于java使用引用机制,返回一个Vector不会带来额外开销,//  public Iterable<Integer> adj(int v) {//      assert v >= 0 && v < n;//      Vector<Integer> adjV = new Vector<Integer>();//      for(int i = 0 ; i < n ; i ++ )//      if( g[v][i] )//      adjV.add(i);//      return adjV;//      }//}import java.util.ArrayList;import java.util.List;// 使用 邻接矩阵 表示 稠密图public class DenseGraph{ private int n; // 图中的节点数 private int m; // 图中的边数 private Boolean[][] g; // 邻接矩阵g private Boolean directed; // 是否为有向图 public DenseGraph(int n, Boolean directed){  this.n = n;  // 初始化图中的节点数量  this.m = 0;  // 图中边(edge)的数量初始化为0  this.directed = directed;  g = new Boolean[n][n];  // 邻接矩阵 g 初始化为一个 n*n 的二维矩阵  // 索引代表图中的节点,g中存储的值为 节点是否有边 } // 返回图中边的数量 public int E(){  return m; } // 返回图中节点的数量 public int V(){  return n; } // 在图中指定的两节点之间加边 public void addEdge(int v, int w){  if (!hasEdge(v, w)){   // 连接[v][w]   g[v][w] = true;   // 无向图   if (!directed)           g[w][v] = true;   // 图中边的数量+1   m++;  } } // 判断两节点之间是否有边 private Boolean hasEdge(int v, int w){  return g[v][w]; } // 返回所有 节点 v 的 邻接节点 public Iterable<Integer> adjacentNode(int v){  // adjacentL 用于存储 v 的邻接节点  List<Integer> adjacentL = new ArrayList<>();  // 找到所有与 v 邻接的节点,将其加入 adjacentL 中  for (int i = 0; i < n;i++){   if (g[v][i])           adjacentL.add(i);  }  return adjacentL; }}

总结

以上就是本文关于Java编程实现邻接矩阵表示稠密图代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

java数据结构之树基本概念解析及代码示例

Java常见数据结构面试题(带答案)

多模字符串匹配算法原理及Java实现代码

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • Java实现的求逆矩阵算法示例

    本文实例讲述了Java实现的求逆矩阵算法.分享给大家供大家参考,具体如下: package demo; public class MatrixInverse { public static double Det(double [][]Matrix,int N)//计算n阶行列式(N=n-1) { int T0; int T1; int T2; double Num; int Cha; double [][] B; if(N>0) { Cha=0; B=new double[N][N]; Num=

  • Java使用分治算法实现排序数索引功能示例【二分搜索】

    本文实例讲述了Java使用分治算法实现排序数索引功能.分享给大家供大家参考,具体如下: /** * Find the first q and return the index * First method is brutal force * Second may * be Divid and Conquer * * @author open201 * */ public class Ono { /** * f(n) = s.length = n; * * @param s * @param q

  • Java常用HASH算法总结【经典实例】

    本文实例讲述了Java常用HASH算法.分享给大家供大家参考,具体如下: /** * Hash算法大全<br> * 推荐使用FNV1算法 * @algorithm None * @author Goodzzp 2006-11-20 * @lastEdit Goodzzp 2006-11-20 * @editDetail Create */ public class HashAlgorithms { /**//** * 加法hash * @param key 字符串 * @param prime

  • 多模字符串匹配算法原理及Java实现代码

    多模字符串匹配算法在这里指的是在一个字符串中寻找多个模式字符字串的问题.一般来说,给出一个长字符串和很多短模式字符串,如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的.该算法广泛应用于关键字过滤.入侵检测.病毒检测.分词等等问题中.多模问题一般有Trie树,AC算法,WM算法等等. 背景 在做实际工作中,最简单也最常用的一种自然语言处理方法就是关键词匹配,例如我们要对n条文本进行过滤,那本身是一个过滤词表的,通常进行过滤的代码如下 for (String document : d

  • java算法实现红黑树完整代码示例

    红黑树 定义 红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组. 红黑树的另一种定义是含有红黑链接并满足下列条件的二叉查找树: 红链接均为左链接:没有任何一个结点同时和两条红链接相连:该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同. 满足这样定义的红黑树和相应的2-3树是一一对应的. 旋转 旋转又分为左旋和右旋.通常左旋操作用于将一个向右倾斜的红色链接旋转为向左链接.对比操作前后,可以看出,该操作

  • java实现的n*n矩阵求值及求逆矩阵算法示例

    本文实例讲述了java实现的n*n矩阵求值及求逆矩阵算法.分享给大家供大家参考,具体如下: 先来看看运行结果: java版的写出来了,用的跟c语言相同的算法,然后看看能不能以后加个框做成程序: import java.math.*; import java.util.*; import java.text.*; public class matrix { static int map1[][]=new int [110][110]; static int just[][]=new int [11

  • Java实现的最大匹配分词算法详解

    本文实例讲述了Java实现的最大匹配分词算法.分享给大家供大家参考,具体如下: 全文检索有两个重要的过程: 1分词 2倒排索引 我们先看分词算法 目前对中文分词有两个方向,其中一个是利用概率的思想对文章分词. 也就是如果两个字,一起出现的频率很高的话,我们可以假设这两个字是一个词.这里可以用一个公式衡量:M(A,B)=P(AB)/P(A)P(B),其中 A表示一个字,B表示一个字,P(AB)表示AB相邻出现的概率,P(A)表示A在这篇文章中的频度,P(B)表示B在这篇文章中的频度.用概率分词的好

  • 详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进行移动 三.有序数组和无序数组共同优缺点 删除数据时必须把后面的数据向前移动来填补删除项的漏洞 四.代码实现 public class OrderArray { private int nElemes; //记录数组长度 private long[] a; /** * 构造函数里面初始化数组 赋值默

  • Java编程实现邻接矩阵表示稠密图代码示例

    我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组,那么A中的一个元素aij不仅体现出了结点vi和结点vj的关系,而且aij的值正可以表示权值的大小. 邻接矩阵模型类 邻接矩阵模型类的类名为AMWGraph.java,能够通过该类构造一个邻接矩阵表示的图,且提供插入结点,插入边,取得某一结点的第一个邻接结点和下一个邻接结点. import java.u

  • Java编程实现深度优先遍历与连通分量代码示例

    深度优先遍历 深度优先遍历类似于一个人走迷宫: 如图所示,从起点开始选择一条边走到下一个顶点,没到一个顶点便标记此顶点已到达. 当来到一个标记过的顶点时回退到上一个顶点,再选择一条没有到达过的顶点. 当回退到的路口已没有可走的通道时继续回退. 而连通分量,看概念:无向图G的极大连通子图称为G的连通分量( Connected Component).任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量. 下面看看具体实例: package com.dataStructure.gra

  • Java编程将汉字转Unicode码代码示例

    上一次接触到编码的知识,还是上大学的时候,那时候学的是通信工程专业,有关编码的内容,不记得是在通信原理还是信息论与编码里面学到的了.却依然记得那个信息论与编码的老师,最喜欢吃的是尖椒肥肠盖饭,不知道是尖椒肥肠吃多了还是太聪明的缘故,三十多岁就开始拜顶了.那四年真是一段难忘的回忆... 话不多说,咱们进入正题.这里是一个简单的Java编程将汉字转Unicode码代码示例,下面是代码: package me.socketthread; public class ToUnicode { /** * @

  • Java编程利用socket多线程访问服务器文件代码示例

    这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码. 接下来进入正文,我们看看利用socket多线程访问服务器代码: ServerMain.java package com.ysk.webServer; import java.io.File; import java.io.IOException; import java.net.ServerSoc

  • Java编程GUI中的事件绑定代码示例

    程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C. 针对java简单的可以理解为程序编译期的绑定:这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定 后期绑定:在运行时根据具体对象的类型进行绑定. 若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间

  • Java编程实现五子棋人人对战代码示例

    利用Java,在控制台操作下,编写的五子棋,作为复习二维数组,面向对象等基础知识.w表示白棋,b表示黑棋 import java.util.Scanner; public class MainMethod { public static char[][] c = new char[10][10]; public static void main(String[] args) { MainMethod mainMethod = new MainMethod(); mainMethod.init()

  • Java编程IP地址和数字相互转换代码示例

    最近才知道,将ip地址转换成十进制.八进制.十六进制同样可以访问网站. IP转为数字(第二种算法.用左移.按位或实现.效率更高.): public long ipToLong(String ipAddress) { long result = 0; String[] ipAddressInArray = ipAddress.split("\\."); for (int i = 3; i >= 0; i--) { long ip = Long.parseLong(ipAddress

  • Java编程常见内存溢出异常与代码示例

    Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象, 并且保证 GC Root 和创建的对象之间有可达路径以免对象被垃圾回收, 那么当创建的对象过多时, 会导致 heap 内存不足, 进而引发 OutOfMemoryError 异常. /** * @author xiongyongshun * VM Args: java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError */ public class OutOfMemoryErrorTe

  • Java编程线程间通信与信号量代码示例

    1.信号量Semaphore 先说说Semaphore,Semaphore可以控制某个资源可被同时访问的个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可.一般用于控制并发线程数,及线程间互斥.另外重入锁ReentrantLock也可以实现该功能,但实现上要复杂些. 功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了.另外等待的

  • java编程实现两个大数相加代码示例

    通常情况,实现大数运算是通过BigInteger和BigDecimal两种方法.这两种方法分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数).主要用于高精度计算中.这两个类使得java中的大数,高精度运算变得很简单.但本文介绍的并不是通过上述两种方法实现Java中的大数运算. 主要的思想是:把两个数存在String中了,然后将每个数字取出,放到数组,由最末位开始计算,算加法,判断是否进位,进位则前位+1,若超过长度,则copy到新的数组. 代码如下: public cl

随机推荐