Java 邻接矩阵的宽度优先算法:搜索提前结束,返回大小为1的队列?
Java 邻接矩阵的宽度优先算法:搜索提前结束,返回大小为1的队列?,java,algorithm,graph,breadth-first-search,adjacency-matrix,Java,Algorithm,Graph,Breadth First Search,Adjacency Matrix,adj是一个邻接矩阵: 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 adj映射下面迷宫的邻接关系(元素#位于一侧): 我用邻接矩阵遍历迷宫中的元素。这里有一个遍历矩阵的广度优先搜索算法 queue Q
adj
是一个邻接矩阵:
0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0
1 0 0 0 1 0 1 0 0
0 0 0 1 0 1 0 0 0
0 0 1 0 1 0 0 0 1
0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0
adj
映射下面迷宫的邻接关系(元素#位于一侧):
我用邻接矩阵遍历迷宫中的元素。这里有一个遍历矩阵的广度优先搜索算法
queue Q = new queue();
boolean[] visited = new boolean[];
int num = 9; //number of elements
int begin = 0; //begin point as defined 'S'
int end = 2; //end point as defined 'E'
private queue BFS(int[][] adj, int begin) {
visited[begin] = true;
Q.enqueue(begin);
while (!Q.isEmpty()) {
int element = Q.dequeue();
int temp = element;
while (temp <= num) {
if ((!visited[temp]) && (adj[element][temp] == 1)) {
if (temp == end) {
return Q;
}
Q.enqueue(temp);
visited[temp] = true;
}
temp++;
}
}
return Q;
}
queue Q=新队列();
布尔值[]已访问=新布尔值[];
int num=9//元素数
int begin=0//开始点定义为“S”
int-end=2//定义为“E”的终点
专用队列BFS(int[][]adj,int begin){
访问[开始]=真;
排队(开始);
而(!Q.isEmpty()){
int元素=Q.dequeue();
int temp=元件;
而(temp您在第一次迭代中遇到了条件temp==end
,因为您的temp从0开始,然后它是1,没有向队列插入元素(因为它不与0相邻),然后它是2,没有插入,在条件temp==end
(两者都等于2)您返回的Q只包含begin
,因为还没有插入任何内容。因此您只有一次外循环迭代和三次内循环迭代
我建议进行以下修改
queue Q = new queue();
boolean[] visited = new boolean[];
int num = 9; //number of elements
int begin = 0; //begin point as defined 'S'
int end = 2; //end point as defined 'E'
private void BFS(int[][] adj, int begin) {
visited[begin] = true;
Q.enqueue(begin);
while (!Q.isEmpty()) {
int element = Q.dequeue();
if (element == end) {
return Q;
}
int temp = 0;
while (temp < num) {
if ((!visited[temp]) && (adj[element][temp] == 1)) {
Q.enqueue(temp);
visited[temp] = true;
}
temp++;
}
}
return Q;
}
queue Q=新队列();
布尔值[]已访问=新布尔值[];
int num=9;//元素数
int begin=0;//开始点定义为'S'
int end=2;//定义为“E”的端点
私有void BFS(int[]adj,int begin){
访问[开始]=真;
排队(开始);
而(!Q.isEmpty()){
int元素=Q.dequeue();
如果(元素==结束){
返回Q;
}
内部温度=0;
while(温度
如果您想知道结束后的最短路径,而不是返回Q
,最好定义int visted[]=new int[num]
,使用-1
表示未访问,并在内部循环中设置visted[temp]=element
。完成后,可以在visted[end]后面找到最短路径
,已访问[已访问[结束]]
…直到您到达开始
我正在使用您的代码@maggot092,它返回一个队列[8]
@riista可能是。此队列只感知您计划访问的顶点,因此这意味着在返回语句算法计划访问的点8处。如果要获取路径,请注意tucuxi注释。
queue Q = new queue();
boolean[] visited = new boolean[];
int num = 9; //number of elements
int begin = 0; //begin point as defined 'S'
int end = 2; //end point as defined 'E'
private void BFS(int[][] adj, int begin) {
visited[begin] = true;
Q.enqueue(begin);
while (!Q.isEmpty()) {
int element = Q.dequeue();
if (element == end) {
return Q;
}
int temp = 0;
while (temp < num) {
if ((!visited[temp]) && (adj[element][temp] == 1)) {
Q.enqueue(temp);
visited[temp] = true;
}
temp++;
}
}
return Q;
}