Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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-航班多重图上的广度优先搜索_Java_Depth First Search_Breadth First Search_Graph Traversal - Fatal编程技术网

Java-航班多重图上的广度优先搜索

Java-航班多重图上的广度优先搜索,java,depth-first-search,breadth-first-search,graph-traversal,Java,Depth First Search,Breadth First Search,Graph Traversal,我有一个以城市为节点,以班次为边的图。每个航班都有起飞时间、到达时间、航班号和航班运行的天数。多条边可以连接每对节点,使图成为多重图。我需要回答这个问题:在可以转机的情况下,某天从地点1到地点2的可用航班有哪些? 以下两种方法使用深度优先搜索查找并打印答案: public static void printRoutes(String day,String source,String place1, String place2, boolean[] visited, LinkedList<E

我有一个以城市为节点,以班次为边的图。每个航班都有起飞时间、到达时间、航班号和航班运行的天数。多条边可以连接每对节点,使图成为多重图。我需要回答这个问题:在可以转机的情况下,某天从地点1到地点2的可用航班有哪些?

以下两种方法使用深度优先搜索查找并打印答案:

public static void printRoutes(String day,String source,String place1, String place2, boolean[] visited, LinkedList<Edge> Route,Grafo g) {

    int index = hash.get(place1);
    visited[index] = true;


    if(place1.equals(place2)) 
        if(isTransferable(day,Route,source))
            writeRoute(Route,source);

    if(place1 != place2) {
        LinkedList<Edge> adjs = g.adjs_no(place1);


        for(Edge a: adjs) {
            if(!visited[hash.get(a.node_final)]) {
                Route.add(a);
                printRoutes(day,source,a.node_final,place2,visited,Route,g);
                Route.remove(a);
            }
        }
    }
    visited[indice] = false;            
}

public static void writeRoute(LinkedList<Edge> Route,String source) {
        System.out.print(source + " -> ");
        for (int i = 0; i < Route.size(); i++) {
            System.out.print(Route.get(i).vertex_final() + " | Flight Number:");
            System.out.print(Route.get(i).flight.flightNumber + " | Departure Time:" + Route.get(i).flight.departureTime);
            System.out.println();
            if(i != Route.size()- 1)System.out.print(Route.get(i).vertex_final() + " -> ");

        }
        System.out.println();
        System.out.println();    
    }
publicstaticvoidprintRoutes(字符串日期、字符串源、字符串位置1、字符串位置2、访问的布尔[]、LinkedList路由、Grafog){
int index=hash.get(place1);
访问[索引]=真;
如果(位置1.等于(位置2))
if(可转让(日期、路线、来源))
writeRoute(路由、源);
如果(位置1!=位置2){
LinkedList adjs=g.adjs_no(位置1);
用于(边a:调整){
如果(!已访问[hash.get(a.node\u final)]){
路线.加入(a);
打印路线(日期、来源、a.node_最终、地点2、访问、路线、g);
路线。删除(a);
}
}
}
访问[指示]=错误;
}
公共静态void writeRoute(LinkedList路由,字符串源){
系统输出打印(源+“->”);
对于(int i=0;i”);
}
System.out.println();
System.out.println();
}
isTransferable
检查两个航班的到达和起飞之间是否至少有40分钟的时间间隔


我想用广度优先搜索而不是DFS来回答这个问题,这样短途旅行会首先出现。不过,我的BFS算法不适用于多重图。是否有办法在此图上执行BFS,以便我可以成功打印给定日期两个城市之间的所有可能行程?

重要的是要了解,对于路线搜索算法而言,您的数据并不完全形成多重图。这是因为可以从给定节点遍历的出站边缘取决于遍历哪个入站边缘以到达该节点。这就是为什么您需要DFS的
isTransferable()
方法

相反,您所拥有的将更好地描述为普通图形的紧凑表示,其中节点表示(城市、到达航班、航班日期)三倍。或者,由于每个航班只有一个目的地,每个节点的特征数据实际上只是到达航班和日期。或者,如果你每天都将其分割成一个单独的图表,那么你剩下的每个节点的特征数据就是到达航班

记住这一点,您应该能够使普通BFS算法适应您的数据表示。您现有的
isTransferable()
方法可能会有所帮助,但关键是要正确识别节点(通过入境航班,而不是(直接)通过城市)