双人项目javaweb项目总结

整体思路:利用邻接矩阵将北京地铁线路图存储,利用Floyd算法求出所有站点间的最短路径。
本题要求的是:查询两点间的线路时换乘线路最少,本算法求得的是经过站点最少的线路,虽然不是严格符合题目要求,但是在绝大部分情况下经过站点最少的线路同样是换成线路最少。
两站查询效果如下:
img

本系统的主要代码如下:

package com.example.subwayUtil;


import java.util.ArrayList;
import java.util.List;

public class Floyd {
    private static final int max = 99999;
    private int[][] path;                       //最短路径
    private int[][] distance;                   //最短距离


    //Floyd算法求最短路径
    public Floyd(int[][] Graph){
        this.path = new int[Graph.length][Graph.length];
        this.distance = new int[Graph.length][Graph.length];
        for(int i = 0; i < Graph.length; i++)
            for(int j = 0; j < Graph.length; j++) {
                this.path[i][j] = j;
                this.distance[i][j] = Graph[i][j];
                this.distance[j][i] = Graph[j][i];
            }


        for(int k = 0; k < Graph.length; k++)
            for(int i = 0; i < Graph.length; i++)
                for(int j = 0; j < Graph.length; j++)
                    if(this.distance[i][j] > this.distance[i][k] + this.distance[k][j]) {
                        this.distance[i][j] = this.distance[i][k] + this.distance[k][j];
                        this.path[i][j] = this.path[i][k];
                    }

    }

    //查找最小距离
    public int SearchMin(int i, int j){
        return this.distance[i][j];
    }

    public static int getMax() {
        return max;
    }

    public int[][] getPath() {
        return path;
    }

    public void setPath(int[][] path) {
        this.path = path;
    }

    public int[][] getDistance() {
        return distance;
    }

    public void setDistance(int[][] distance) {
        this.distance = distance;
    }


    //将最短距离的站点下标加入到列表中
    public List<Integer> printPath(int i, int j){
        List<Integer> list = new ArrayList<>();
        while(i != j){
            System.out.println(i + "  "  +  j);
            list.add(i);
            i = this.path[i][j];
//            list.add(i);
        }
        list.add(i);
        return list;
    }


}
package com.example.subwayUtil;

import java.util.ArrayList;
import java.util.List;

public class Line {


    private String lineName;                              //存储站点所在线路名
    private List<String> stations = new ArrayList<>();      //存储线路内所有站点名

    public String getLineName() {
        return lineName;
    }

    public void setLineName(String lineName) {
        this.lineName = lineName;
    }

    public List<String> getStations() {
        return stations;
    }

    public void setStations(List<String> stations) {
        this.stations = stations;
    }
    @Override
    public String toString() {
        return "Station{" +
                "stationNum='" + lineName + '\'' +
                ", stations=" + stations +
                '}';
    }
}
package com.example.subwayUtil;

import com.example.domain.Stopinfo;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public class SearchUtil {

    public static List<String> searchNoInOneLine(List<Stopinfo> allStop, String stop1, String stop2){
        System.out.println(allStop);
        // 创建所有线路列表
        List<Line> lines = new ArrayList<>();
        for (Stopinfo stopinfo : allStop) {
            int flag = 0;
            for (Line line : lines) {
                if (line.getLineName().equals(stopinfo.getLineName())){
                    line.getStations().add(stopinfo.getStopName());
                    flag = 1;
                }
            }
            if (flag == 0){
                Line line = new Line();
                line.setLineName(stopinfo.getLineName());
                line.getStations().add(stopinfo.getStopName());
                lines.add(line);
            }
        }
        System.out.println("\n\n\n\nlog\n\n\n");
        for (Line line : lines) {
            System.out.println(line.getLineName());
            for (String station : line.getStations()) {
                System.out.print(station + " ");
            }

        }
// 存储所有站点
        List<String> allStations = new ArrayList<>();
        for (Line line : lines) {
            allStations.addAll(line.getStations());
        }
        // 去重
        HashSet hashSet = new HashSet(allStations);
        allStations = new ArrayList<>(hashSet);

        Subway subway = new Subway(allStations);

        // 添加线路图中的边
        for (Line item : lines) {
            List<String> line = item.getStations();
            if (item.getLineName().equals("10号线"))
                subway.relation(line.get(0), line.get(line.size()-1));
            for (int i = 0; i < line.size()-1; i++) {
                subway.relation(line.get(i), line.get(i+1));
            }
        }

        Floyd floyd = new Floyd(subway.getSubwayMatrix());
        subway.setPath(floyd.getPath());
        System.out.println("\n\n\n"+stop1+"   "+stop2+"\n\n\n");
        List<Integer> path = floyd.printPath(subway.getSite(stop1), subway.getSite(stop2));
        List<String> pathName = new ArrayList<>();
        for (Integer idx : path) {
            pathName.add(subway.getName(idx));
        }

        return pathName;
    }

}
package com.example.subwayUtil;

import java.util.List;

public class Subway {
    private int[][] subwayMatrix;           //存储地铁线路
    private List<String> stationName;       //存储所有站点名
    private int[][] path;                   //存储两站点间路径
    private static final int max = 99999;   //最大距离,两站点间不可达


    //初始化地铁线路图
    public Subway(List<String> stationName){
        System.out.println("\n\n\n\n" + stationName.size() + "\n\n\n\n");
        this.stationName = stationName;
        this.subwayMatrix = new int[stationName.size()][stationName.size()];
        this.path = new int[stationName.size()][stationName.size()];
        for(int i = 0; i < stationName.size(); i++){
            for(int j = 0; j < stationName.size(); j++){
                if(i == j)
                    subwayMatrix[i][j] = 0;
                else {
                    subwayMatrix[i][j] = max;
                    subwayMatrix[j][i] = max;
                }
            }
        }
    }

    public int getSite(String station){
        return stationName.indexOf(station);
    }

    public String getName(int site){
        return stationName.get(site);
    }


    //初始化相邻地铁站之间距离为1
    public void relation(String start, String end){
        int i = getSite(start);
        int j = getSite(end);
        this.subwayMatrix[i][j] = 1;
        this.subwayMatrix[j][i] = 1;
    }

    public int[][] getSubwayMatrix() {
        return subwayMatrix;
    }

    public void setSubwayMatrix(int[][] subwayMatrix) {
        this.subwayMatrix = subwayMatrix;
    }

    public List<String> getStationName() {
        return stationName;
    }

    public void setStationName(List<String> stationName) {
        this.stationName = stationName;
    }

    public int[][] getPath() {
        return path;
    }

    public void setPath(int[][] path) {
        this.path = path;
    }

    public static int getMax() {
        return max;
    }

}
 
posted @   liu_ru_jun  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示