Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用BFS计算到图形中所有其他顶点的距离?_Java_Graph_Breadth First Search - Fatal编程技术网

Java 如何使用BFS计算到图形中所有其他顶点的距离?

Java 如何使用BFS计算到图形中所有其他顶点的距离?,java,graph,breadth-first-search,Java,Graph,Breadth First Search,如何使用BFS搜索计算从起点顶点到所有其他顶点的距离? 如果没有到顶点的路径,则距离应报告为-1。 我有一个生成图形的类和一个实现了BFS搜索的方法距离(int start),但我不知道如何计算距离并将其返回到合适的数据结构中 预期产出: 距离(0); >>>顶点0到1的距离为1 >>>从顶点0到2的距离为1 >>>从顶点0到3的距离为2 >>>顶点0到4的距离为2 >>>从顶点0到5的距离为3 import java.util.*; 导入静态java.lang.System.out; 导入

如何使用BFS搜索计算从起点顶点到所有其他顶点的距离? 如果没有到顶点的路径,则距离应报告为-1。 我有一个生成
图形的类
和一个实现了BFS搜索的方法
距离(int start)
,但我不知道如何计算距离并将其返回到合适的数据结构中

预期产出:


距离(0);
>>>顶点0到1的距离为1
>>>从顶点0到2的距离为1
>>>从顶点0到3的距离为2
>>>顶点0到4的距离为2
>>>从顶点0到5的距离为3
import java.util.*;
导入静态java.lang.System.out;
导入java.util.concurrent.ThreadLocalRandom;
公共类图{
int_顶点;
数组列表调整列表;
专用无效补遗(整数u,整数v){
调整列表。获取(u)。添加(v);
调整列表。获取(v)。添加(u);
//out.println(调整列表);
}
/*
*循环遍历所有对顶点u、v并确定,
*随机带概率p,边缘是否(u,v)
*在图表中。
*/
图(int顶点,双prob){
_顶点=顶点;
adj_列表=新阵列列表(顶点);
对于(int u=0;u<顶点;u++){
//系统输出打印LN(i);
adj_list.add(newarraylist());
}
对于(int v=0;v<顶点;v++){
对于(int u=0;u<顶点;u++){
double random=ThreadLocalRandom.current().nextDouble(0,1);
如果(随机>概率){
//系统输出println(checkElem(adj_list,v));
if(checkElem(调整列表,v,u)=false&&u!=v){
附录(v,u);
}
}
}
}
}
public void printGraph(){
对于(inti=0;i”+adj_list.get(i.get(j));
} 
System.out.println();
} 
}
/*
*@param vert:图形中的顶点
*/
公共void打印顶点(int vert){
系统输出打印(“->”+adj_list.get(vert));
}
/*
*@param arr:表示图形的列表列表
*@param vertex:图中的一个顶点
*@param node:要在顶点中检查的节点
*/
私有布尔校验元素(ArrayList arr、int顶点、int节点){
ArrayList temp=arr.get(顶点);
if(温度包含(节点)){
返回true;
}否则{
返回false;
}
}
/*
*@param start:在图形中开始搜索的顶点
*/
公共空隙距离(int start){
访问的布尔[]=新的布尔[_顶点];
ArrayList队列=新建ArrayList();
访问[开始]=真;
queue.add(开始);
而(queue.size()!=0){
//out.println(队列);
//将顶点从队列中取出并打印它
开始=队列。删除(0);
//获取出列顶点的所有相邻顶点
//如果未访问相邻的,则标记它
//参观并排队
ArrayList temp=adj_list.get(开始);
迭代器i=临时列表迭代器();
//out.println(“顶点:+start+”距离:+edgeDist”);
而(i.hasNext()){
out.println(开始);
int n=i.next();
如果(!已访问[n]){
访问[n]=真;
添加(n);
} 
}   
}
}
公共静态void main(字符串[]args){
图形=新图形(5,0.5);
距离(0);
}   
}

计算从源到所有邻接的距离

更新您的代码以使用
isEmpty()
,因为它是固定时间,并且不使用
size()==0
,使用
队列
添加相邻顶点

 public int distance(int vertex) {
            boolean visited[] = new boolean[_vertices];
            Queue<Integer> queue = new ArrayDeque<>();

            visited[vertex] = true;
            queue.add(vertex);

            int distance = 0;

            while (!queue.isEmpty()) {
                int v = queue.poll();

                List<Integer> adj = adj_list.get(v);
                distance++;
                for (Integer w : adj) {
                    if (!visited[w]) {
                        System.out.println("Distance from vertex: " + vertex + " to: " + w +" is " + distance);
                        visited[w] = true;
                        queue.add(w);
                    }
                }
            }
            return distance == 0 ? -1 : distance;
        }
公共整数距离(整数顶点){
访问的布尔[]=新的布尔[_顶点];
Queue Queue=new ArrayDeque();
访问[顶点]=真;
添加(顶点);
整数距离=0;
而(!queue.isEmpty()){
int v=queue.poll();
List adj=adj_List.get(v);
距离++;
for(整数w:adj){
如果(!已访问[w]){
System.out.println(“从顶点:“+vertex+”到:“+w+”的距离是“+Distance”);
访问[w]=真;
添加(w);
}
}
}
返回距离==0?-1:距离;
}

感谢您就问题的时间复杂性提出的意见!如果我可以问的话,
System.out.println(w)
打印出一个顶点的边
v
distance
在遍历所有节点后返回距离,我看不出它会返回到给定顶点的所有顶点的距离?我添加了预期输出以澄清问题它几乎可以工作了!我注意到,如果到顶点的距离大于1,则起始顶点将更改为相邻顶点,然后计算从相邻顶点到该顶点的距离。例如,V=5如果顶点0有节点1,2,3,则输出为
从顶点:0到:节点的距离为1
,但对于不是节点到顶点0的顶点4,则输出类似于
从顶点:1到:4的距离为2
。您明白了吗?或者我应该澄清一下吗?我将
v
更改为
vertex
打印声明中的源代码谢谢您花时间,它完全按照预期工作