我试图在java中使用邻接列表(表示图形的空间必须是O(m),其中m是边数)来表示图形(连接 - 非定向 - 无权重)使用BFS查找一些信息。我从一个名为graph.txt的txt中获取有关该图的信息。我不确定我是否使用空间O(m)来保存图表,而且我不确定这是否是保存它以便使用BFS的好方法。
public class Vertex {
boolean visited = false;
int number;
ArrayList<Integer> adjList;
public Vertex(int i) {
this.number= i;
adjList = new ArrayList<Integer>();
}
public void addNeighbor(int i) {
this.adjList.add(i);
}
}
答案 0 :(得分:1)
虽然您当然可以使此表示有效,但您需要一种方法来访问Vertex
number
,而无需搜索整个图表。为了实现此目的,您需要v[]
个Vertex
个对象的列表或数组,以使v[i].number
始终等于i
。
由于你无论如何都需要这个数组/列表,你也可以用&#34;空&#34;预先填充它。 Vertex
个对象,并更改表示形式以使用Vertex
个对象而不是Integer
个列表,从而减少间接性:
public class Vertex {
int number;
List<Vertex> adjList = new ArrayList<Vertex>();
public Vertex(int i) {
this.number= i;
}
public void addNeighbor(Vertex v) {
adjList.add(v);
}
}
请注意,将visited
与Vertex
一起存储可能不是一个好主意,因为visited
是算法状态的一部分,而不是图表的一部分。您应该将visited
布尔变量数组与您的表示分开,并且仅在BFS运行期间保留:
static void bfs(Vertex[] v, int start) {
boolean[] visited = new boolean[graph.length];
Queue<Vertex> q = new Deque<Vertex>();
q.add(v[start]);
while (q.peek() != null) {
Vertex c = q.remove();
if (visited[c.getNumber()]) {
continue;
}
// Do something with the current vertex c
...
// Mark c visited, and add its neighbors to the queue
visited[c.getNumber()] = true;
for (Vector a : c.neighbors()) {
q.add(a);
}
}
}
答案 1 :(得分:1)
是的,您的代表确实使用O(m)空间。鉴于你的代表,我有两个不同的建议。
1。 如果你真的想将Vertex表示为一个类,那么让它的相邻顶点列表为a 列表与LT;顶点&GT;而不是List&lt; Integer&gt;
或
2。 由于您的Vertex类似乎不包含顶点的Integer值以外的任何信息,为什么不直接使用Integer? 然后该图表可以表示为
ArrayList<ArrayList<Integer>> graph;
其中graph [i]是连接到顶点i的顶点列表 这使得您无需从整数id到Vertex实例找到匹配项。