Java语言中的邻接矩阵

Java语言中的邻接矩阵,java,graph,adjacency-matrix,Java,Graph,Adjacency Matrix,我被图形和邻接矩阵弄糊涂了。我正在为一个类做一个赋值,在这个类中,我有一个节点的文本文件和一个边的文本文件,我必须读取它们中的每一个,并使它们成为一个图,然后我可以执行一些操作,比如确定图是否连接,找到最小生成树,遍历和找到路径。我以前从未使用过图形,我对整个事情感到困惑,我想知道是否有人能帮我解释一下 首先,我是否自己构建一个图(可能有节点和边类?),然后从中构造一个邻接矩阵?或者邻接矩阵本身就是图 然后我对如何在程序中实现相邻矩阵感到困惑。节点是“ND5”和“NR7”之类的名称,因此我必须设

我被图形和邻接矩阵弄糊涂了。我正在为一个类做一个赋值,在这个类中,我有一个节点的文本文件和一个边的文本文件,我必须读取它们中的每一个,并使它们成为一个图,然后我可以执行一些操作,比如确定图是否连接,找到最小生成树,遍历和找到路径。我以前从未使用过图形,我对整个事情感到困惑,我想知道是否有人能帮我解释一下

首先,我是否自己构建一个图(可能有节点和边类?),然后从中构造一个邻接矩阵?或者邻接矩阵本身就是图

然后我对如何在程序中实现相邻矩阵感到困惑。节点是“ND5”和“NR7”之类的名称,因此我必须设置并读取[ND5][NR7]的边缘,但我不确定如何设置这样的2d数组,外部为字符串,内部为数字

我一直在互联网上搜索,并阅读了我的教科书中关于图表的整个章节,但我真的不理解建立这个图表的第一个基本步骤。我非常感谢你的帮助。谢谢

首先,我是否自己构建一个图(可能有节点和边类?),然后从中构造一个邻接矩阵?或者邻接矩阵本身就是图

如果没有阅读作业说明,任何人都无法肯定地回答这个问题。但是,除非作业特别提到
节点
类或其他什么,否则我猜您应该使用邻接矩阵来表示图形

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

我完全理解你在这里的困惑。实际上,您要做的是在节点名称和矩阵索引之间创建一个(一对一的关系)。例如,如果图形中有n个节点,则需要一个n×n矩阵(即
新布尔[n][n]
),并且每个节点将对应于0到n范围内的单个整数(不包括n)

我不确定到目前为止您的类中已经介绍了哪些数据结构,但最简单的方法可能是使用
映射
,它可以让您查找像
“ND5”
这样的名称并返回一个整数(索引)

另一个不错的选择可能是使用数组。您可以将所有节点名放入一个数组中,使用排序,然后在排序后,可以使用查找该数组中特定节点名的索引。我认为这个解决方案实际上比使用
Map
要好,因为它可以让您以两种方式进行查找。您可以使用进行名称到索引的查找,只需索引到数组中即可进行名称到索引的查找


示例:假设我们有以下图表:

给出该图,下面是一些示例代码,说明如何做到这一点:(警告!未经测试)

导入java.util.array;
//将所有节点名称添加到数组中
String[]nameLookup=新字符串[4];
名称查找[0]=“A”;
名称查找[1]=“B”;
名称查找[2]=“C”;
名称查找[3]=“D”;
//我们的阵列已经正确排序,
//但你的可能不是,所以你应该把它分类。
//(如果未排序,则binarySearch将不起作用)
排序(名称查找);
//我假设你的边是未加权的,所以我使用布尔值。
//如果有加权边,则应使用int或double。
//true=>已连接,false=>未连接
//(布尔数组中的条目默认为false)
布尔[][]矩阵=新布尔[4];

对于(int i=0;我会发布每个文件的小样本以及迄今为止获得更好帮助的任何代码。“首先,我是否自己构建一个图(可能有节点和边类?),然后从中构建一个邻接矩阵?或者邻接矩阵本身就是图?”在没有阅读作业说明的情况下,任何人都无法肯定地回答这个问题。然而,除非作业特别提到
节点
类或其他什么,我猜你应该用邻接矩阵来表示你的图。啊,这真是太神奇了谢谢!你真的帮了我的忙:)@Josephine-我很高兴这有道理!请注意,我没有测试上面的任何代码,因此可能会有一些语法错误,但我认为您应该能够了解大致情况。
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]);
  }
}