当前位置: 首页 > 面试题库 >

Java中的邻接矩阵

卢阳泽
2023-03-14
问题内容

我对图和邻接矩阵感到困惑。我正在为
一个班级做作业,我有一个节点的文本文件和一个边的文本文件,我必须
阅读它们的每一个并将它们制成一个图,然后可以在该图上执行
操作,例如确定图是否为连接,找到最小的
生成树,遍历并找到路径。但是我之前从未使用过图形
,并且整个过程让我很困惑,我想知道
是否有人可以帮助我解释其中的一些内容。

首先,我是否要自己建立一个图(也许有节点和边类?)
,然后从中构造一个邻接矩阵?还是邻接矩阵
本身就是图?

然后,我对如何在
程序中实现相邻矩阵感到困惑。节点被命名为“ ND5”和“ NR7”之类的东西,因此我将不得不
设置并读取[ND5] [NR7]的边缘,但是我不确定如何为
字符串设置像这样的二维数组外面和里面的数字。

我一直在互联网上进行搜索,并通读了
教科书中有关图形的整章内容,但实际上我并不仅仅了解
设置此图形的第一步。我真的很感谢您的帮助。
谢谢。


问题答案:

首先,我是否要自己建立一个图(也许有节点和边类?),然后从中构造一个邻接矩阵?还是邻接矩阵本身就是图?

没有人真正阅读您的作业说明就无法肯定地回答该问题。但是,除非分配中特别提及Node和Edge类,否则我的猜测是您仅应使用邻接矩阵来表示图形。

然后,我对如何在程序中实现相邻矩阵感到困惑。节点被命名为“ ND5”和“ NR7”之类的东西,因此我将不得不设置并读取其边缘,[ND5][NR7]但是我不确定如何设置一个二维数组,其外部为字符串,内部为数字。

我完全可以理解您在这里的困惑。您实际要做的是 在节点名称和矩阵索引之间创建双射(一对一关系)。对于例如,如果你有Ñ在图中的节点,则需要一个n×n的矩阵(即new boolean[n][n]),并且每个节点将对应于一个单独的整数范围为0直到Ñ(不含n个)。

我不确定目前为止您班上已经讲过什么数据结构,但是最简单的方法可能是使用Map
它可以让您查找类似的名称”ND5”并获取整数(索引) 。

另一个不错的选择是使用数组。你可以把你所有的节点名称到一个数组,排序它Arrays.sort,然后一旦它的排序,你可以使用 发现,阵列中的特定节点名的索引。我认为该 解决方案实际上比使用a更好,因为它可以让您 双向进行查找。您曾经 用来进行名称到索引的查找,而您只是在数组中建立索引以执行索引到 名称的查找。
Arrays.binarySearch

Map

Arrays.binarySearch

给定该图,下面是一些示例代码,说明了如何执行此操作:(警告!
未经测试)

import java.util.Arrays;

// Add all your node names to an array
String[] nameLookup = new String[4];
nameLookup[0] = "A";
nameLookup[1] = "B";
nameLookup[2] = "C";
nameLookup[3] = "D";

// Our array is already properly sorted,
// but yours might not be, so you should sort it.
// (if it's not sorted then binarySearch won't work)
Arrays.sort(nameLookup);

// I'm assuming your edges are unweighted, so I use boolean.
// If you have weighted edges you should use int or double.
// true => connected, false => not connected
// (entries in boolean arrays default to false)
boolean[][] matrix = new boolean[4];
for (int i=0; i<matrix.length; i++) matrix[i] = new boolean[4];

// I don't want to call Arrays.binarySearch every time I want an index,
// so I'm going to cache the indices here in some named variables.
int nodeA = Arrays.binarySearch(nameLookup, "A");
int nodeB = Arrays.binarySearch(nameLookup, "B");
int nodeC = Arrays.binarySearch(nameLookup, "C");
int nodeD = Arrays.binarySearch(nameLookup, "D");

// I'm assuming your edges are undirected.
// If the edges are directed then the entries needn't be semmetric.
// A is connected to B
matrix[nodeA][nodeB] = true;
matrix[nodeB][nodeA] = true;
// A is connected to D
matrix[nodeA][nodeD] = true;
matrix[nodeD][nodeA] = true;
// B is connected to D
matrix[nodeB][nodeD] = true;
matrix[nodeD][nodeB] = true;
// C is connected to D
matrix[nodeC][nodeD] = true;
matrix[nodeD][nodeC] = true;

// Check if node X is connected to node Y
int nodeX = Arrays.binarySearch(nameLookup, stringNameOfX);
int nodeY = Arrays.binarySearch(nameLookup, stringNameOfY);

if (matrix[nodeX][nodeY]) { /* They're connected */ }

// Print all of node Z's neighbors' names
int nodeZ = Arrays.binarySearch(nameLookup, stringNameOfZ);
for (int i=0; i<matrix.length; i++) {
  if (matrix[nodeZ][i]) {
    System.out.println(nameLookup[nodeZ] + " is connected to " + nameLookup[i]);
  }
}


 类似资料:
  • 实现图的最简单的方法之一是使用二维矩阵。在该矩阵实现中,每个行和列表示图中的顶点。存储在行 v 和列 w 的交叉点处的单元中的值表示是否存在从顶点 v 到顶点 w 的边。 当两个顶点通过边连接时,我们说它们是相邻的。 Figure 3 展示了 Figure 2 中的图的邻接矩阵。单元格中的值表示从顶点 v 到顶点 w 的边的权重。 Figure 3 邻接矩阵的优点是简单,对于小图,很容易看到哪些节

  • 我试图实现一个无向未加权图的邻接矩阵上的BFS,它返回访问的节点数。到目前为止,我已经提出了这个,但我认为这是不对的,因为当我打印出top/vised节点时,我得到了一些节点的多次出现,而且它没有排序。我在某个地方读到过,BFS是一个拓扑排序,我得到的顺序不是排序的。

  • 作为一项练习,我必须建立一个卫星导航系统,规划从一个位置到另一个位置的最短和最快路线。它必须尽可能快,而不需要使用太多内存。 我很难决定使用哪种结构来表示图形。我知道矩阵更适合密集图,列表更适合稀疏图。我更倾向于使用列表,因为我认为添加顶点将是这个程序中最累人的部分。 我只是想听听你们的意见。如果我把一个典型的路线图看作一个图形,其中不同的位置是节点,道路是边缘。你认为它是稀疏的还是密集的?在这种

  • B)设是带有向图(无环多边)的一个邻接矩阵,其中是边到的一个权重。如果没有这样的边并且对于evrey我们有。矩阵。槽表示什么?最小权重?还是...? 知道吗? 编辑:我的意思是这些算法在图中找到哪一个?找到最大重量?最小重量?什么也没找到?

  • 本文向大家介绍C++实现图的邻接矩阵表示,包括了C++实现图的邻接矩阵表示的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现图的邻接矩阵表示代码,供大家参考,具体内容如下 1.遇到的问题:教材中写着子类Graphmtx(我用GrapMatrix)继承基类Graph 但是我在子类GraphMatrix中使用父类Graph的保护成员属性:maxVertices 显示没有声明(如下

  • 我不知道该如何解决这个问题。我得到了一个有12个节点A-L的图。17个边缘连接它们。我被告知要找到从A到L的所有路径。我可以遍历一个节点多次,但只能遍历一次边。输出应该打印每个路径和路径总数。 例如,如果只有1个路径。输出应为: 我想一个递归的深度优先搜索函数应该可以解决这个问题,但我就是想不出一个打印每一条路径的方法。例如,如果我的函数找到一个路径ABDL并到达结尾L,它将打印ABDL。然后它回