po3a  

/**

     * function:起终查询

     */

    // 构建邻接表

    public static Map<String, Map<String, Integer>> buildAdjacencyList() {

        Connection connection = JDBCUtils.getConn();

        Map<String, Map<String, Integer>> adjacencyList = new HashMap<>();

 

        try {

            Statement statement = connection.createStatement();

            ResultSet resultSet = statement.executeQuery("SELECT Starting_Station, Terminus_Station FROM station");

 

            while (resultSet.next()) {

 

                String startingStation = resultSet.getString("Starting_Station");

                String terminusStation = resultSet.getString("Terminus_Station");

 

                addConnection(adjacencyList, startingStation, terminusStation);

                addConnection(adjacencyList, terminusStation, startingStation);

            }

 

            resultSet.close();

            statement.close();

            connection.close();

        } catch (SQLException e) {

            e.printStackTrace();

            // 适当处理 SQLException

        }

 

        return adjacencyList;

    }

 

 

 

    // 将连接添加到邻接表

    private static void addConnection(Map<String, Map<String, Integer>> adjacencyList, String source, String destination) {

        if (!adjacencyList.containsKey(source))

        {

            adjacencyList.put(source, new HashMap<>());

        }

        adjacencyList.get(source).put(destination, 1);

    }

 

 

    //根据 buildAdjacencyList()函数 求邻接表 最短路径

    public static List<String> shortest(User user) {

        String startingStation = user.getStarting_Station();

        String terminusStation = user.getTerminus_Station();

 

        Map<String, Map<String, Integer>> adjacencyList = buildAdjacencyList();

        Map<String, Integer> distance = new HashMap<>();

        Map<String, String> previous = new HashMap<>();

        PriorityQueue<String> queue = new PriorityQueue<>(Comparator.comparingInt(distance::get));

 

        for (String station : adjacencyList.keySet()) {

            distance.put(station, Integer.MAX_VALUE);

            previous.put(station, null);

        }

 

        distance.put(startingStation, 0);

        queue.add(startingStation);

 

        while (!queue.isEmpty()) {

            String currentStation = queue.poll();

            if (currentStation.equals(terminusStation)) {

                break; // Found shortest path to terminus station

            }

 

            Map<String, Integer> neighbors = adjacencyList.get(currentStation);

            if (neighbors != null) {

                for (String neighbor : neighbors.keySet()) {

                    int alt = distance.get(currentStation) + neighbors.get(neighbor);

                    if (alt < distance.get(neighbor)) {

                        distance.put(neighbor, alt);

                        previous.put(neighbor, currentStation);

                        queue.add(neighbor);

                    }

                }

            }

        }

 

        // Reconstruct shortest path

        List<String> shortestPath = new ArrayList<>();

        String current = terminusStation;

        while (previous.get(current) != null) {

            shortestPath.add(current);

            current = previous.get(current);

        }

        shortestPath.add(startingStation);

        Collections.reverse(shortestPath);

 

        System.out.println(shortestPath);

 

        return shortestPath;

 

    }

posted on 2024-06-16 23:56  po3a  阅读(19)  评论(0)    收藏  举报