Java 如何制作Dijkstra';双向s算法

Java 如何制作Dijkstra';双向s算法,java,dijkstra,Java,Dijkstra,目前,对于任何边(x,y),只有y顶点被添加到我的邻接列表中。如果我有另一条边(z,x),它只显示y是x的邻居,而y和z都应该是x的邻居。我尝试过使用两个哈希映射,一个用于起始顶点,一个用于结束顶点,然后合并这两个邻接列表,但这并没有改变任何事情。该示例当前位于我的CalculateSource()方法中,该方法是下面的方法之一。任何想法都非常感谢 public class ReadInput { Vertex[] vertex = new Vertex[25252]; fina

目前,对于任何边(x,y),只有y顶点被添加到我的邻接列表中。如果我有另一条边(z,x),它只显示y是x的邻居,而y和z都应该是x的邻居。我尝试过使用两个哈希映射,一个用于起始顶点,一个用于结束顶点,然后合并这两个邻接列表,但这并没有改变任何事情。该示例当前位于我的CalculateSource()方法中,该方法是下面的方法之一。任何想法都非常感谢

public class ReadInput {
    Vertex[] vertex = new Vertex[25252];
    final String DELIMITER = ",";
    int indexVertex = 0;
    public Edge[] edge = new Edge[127807];
    int indexEdge = 0; 

    private  Map<Integer, Vertex> VertexHash = new HashMap();
    //private  Map<Integer, List <Edge>> EdgeHash = new HashMap();
    private  Map<Integer, Edge> EdgeHashStart = new HashMap();
    private  Map<Integer, Edge> EdgeHashEnd = new HashMap();

    public Graph readFromStream() throws NumberFormatException, IOException {
         Graph graph = new Graph();
         //25252 number of elements in Place.txt file   
         System.out.println("Reading in Data......");
        //Delimiter used in CSV file
            String line = "";
            //Create the file reader
            BufferedReader fileReader = new BufferedReader(new FileReader("Place.txt"));
            String IDString = null;
            String name = null;
            int ID = 0;
            //Read the file line by line
            while ((line = fileReader.readLine()) != null) 
            {
                //Get all tokens available in line
                String[] tokens = line.split(DELIMITER);

                     IDString = tokens[0];
                     name = tokens[1];
                     ID = Integer.parseInt(IDString);

                 vertex[indexVertex] = new Vertex(ID,name);
                 VertexHash.put(ID, vertex[indexVertex]);

                 graph.addVertex(ID,name);

                indexVertex++;
            }
            fileReader.close();


        String line2 = "";
        BufferedReader fileReader2 = new BufferedReader(new FileReader("Road.txt"));
        String valueString = null;
        String vertex1IDName = null;
        String vertex2IDName = null;
        String extra = null;
        float value = 0;
        int vertex1ID = 0;
        int vertex2ID = 0;
        //Read the file line by line
        while ((line2 = fileReader2.readLine()) != null) 
        {
            //Get all tokens available in line
            String[] tokens2 = line2.split(DELIMITER);

                vertex1IDName = tokens2[0];
                vertex2IDName = tokens2[1];
                valueString = tokens2[2];
                if(tokens2.length - 1 == 3) {
                    extra = tokens2[tokens2.length - 1];
                }
                else {
                    extra = "";
                }
                vertex1ID = Integer.parseInt(vertex1IDName);
                vertex2ID = Integer.parseInt(vertex2IDName);
                value = Float.parseFloat(valueString);





                Vertex v1 = new Vertex(0, " ");
                Vertex v2 = new Vertex(0, " ");

                if(VertexHash.containsKey(vertex1ID) ) {
                    v1 = VertexHash.get(vertex1ID);
                }
                else if(vertex1ID != 0 && (VertexHash.containsKey(vertex1ID) == false)) {
                    v1.setID(vertex1ID);
                }
                if(VertexHash.containsKey(vertex2ID)) {
                    v2 = VertexHash.get(vertex2ID);
                }
                else if(vertex2ID != 0 && (VertexHash.containsKey(vertex2ID) == false)) {
                    v2.setID(vertex2ID);
                }

                if(v1.getID() != 0 && v2.getID() !=0) {

                    edge[indexEdge] = new Edge(value,v1, v2, extra);
                    EdgeHashStart.put(v1.getID(),edge[indexEdge]);
                    EdgeHashEnd.put(v2.getID(),edge[indexEdge]);

                    v1.addNeighbour(edge[indexEdge]);
                    //adding v2 as a neighbor just adds the actualVertex being worked on "x" to the adj list
                    //v2.addNeighbour(edge[indexEdge]);
                    graph.addEdge(value,v1, v2, extra);
                    indexEdge++;
                }   
        } 
        fileReader2.close();
        return graph;

    }
    public Vertex calcualteDestination() {

        Scanner scanUserInput = new Scanner(System.in);
        System.out.println("Enter the Destination Name:");
        String destinationName = scanUserInput.nextLine();
        scanUserInput.close();

         Vertex Destination = new Vertex(0,null);

       for(int i = 0; i<indexVertex; i++) {
           if(destinationName.equals(vertex[i].getName())){

               Destination.setID(vertex[i].getID());
               Destination.setName(vertex[i].getName());

           }
       }   
        for(int k = 0; k<indexEdge; k++) {
            if(Destination.getID() == edge[k].getTargetVertex().getID()){
                Destination.setID(edge[k].getTargetVertex().getID());
                Destination.setAdjacenciesList(edge[k].getTargetVertex().getAdjacenciesList());

            }
       } 
        return Destination;
    }

    public Vertex calculatesSource() {
        Scanner scanUserInput = new Scanner(System.in);  
        System.out.println("Enter the Source Name:");
        String sourceName = scanUserInput.nextLine();

        Vertex Source = new Vertex(0, null);

        for(int i = 0; i<indexVertex; i++) {
            if(sourceName.equals(vertex[i].getName())){

                Source.setID(vertex[i].getID());

                Source.setName(vertex[i].getName());

            }
        }   

            //for(int k = 0; k<indexEdge; k++) {
                //(sourceID,getAdjList) 
                //need to add (GetADjList,sourceID)
                List<Edge> listMerge = new ArrayList<Edge>(); 
                if(EdgeHashStart.containsKey(Source.getID())) {
                    //add all to adj list
                    listMerge.addAll(EdgeHashStart.get(Source.getID()).getStartVertex().getAdjacenciesList());
                }
                if(EdgeHashEnd.containsKey(Source.getID())) {
                    //add all to adj list
                    listMerge.addAll(EdgeHashEnd.get(Source.getID()).getTargetVertex().getAdjacenciesList());
                }
                Source.setAdjacenciesList(listMerge);
                //old setADjLists code
                /*if(Source.getID() == edge[k].getStartVertex().getID()){
                    Source.setID(edge[k].getStartVertex().getID());
                    Source.setAdjacenciesList(edge[k].getStartVertex().getAdjacenciesList());

                }*/
             //}
        return Source;
    }


    public Vertex SetAdjList(Vertex actualVertex) {

        for(int j = 0; j<edge.length-1; j++) {

            if(actualVertex.getID() == edge[j].getTargetVertex().getID()){  //edge[j].getStartVertex

                actualVertex.setAdjacenciesList(edge[j].getTargetVertex().getAdjacenciesList());
            }
        }

        return actualVertex;
    }
公共类ReadInput{
顶点[]顶点=新顶点[25252];
最后一个字符串分隔符=“,”;
int indexVertex=0;
公共边缘[]边缘=新边缘[127807];
int indexEdge=0;
私有映射vertefush=新HashMap();
//private-Map-EdgeHash=new-HashMap();
私有映射EdgeHashStart=newHashMap();
private-Map-EdgeHashEnd=new-HashMap();
public Graph readFromStream()引发NumberFormatException,IOException{
图形=新图形();
//25252.txt文件中的元素数
System.out.println(“读入数据…”);
//CSV文件中使用的分隔符
字符串行=”;
//创建文件读取器
BufferedReader fileReader=new BufferedReader(new fileReader(“Place.txt”);
字符串IDString=null;
字符串名称=null;
int ID=0;
//逐行读取文件
而((line=fileReader.readLine())!=null)
{
//让所有可用的代币排队
String[]tokens=line.split(分隔符);
IDString=tokens[0];
名称=代币[1];
ID=Integer.parseInt(IDString);
顶点[索引顶点]=新顶点(ID,名称);
放置(ID,顶点[indexVertex]);
graph.addVertex(ID,name);
indexVertex++;
}
fileReader.close();
字符串line2=“”;
BufferedReader fileReader2=新的BufferedReader(新文件阅读器(“Road.txt”);
字符串valueString=null;
字符串vertex1IDName=null;
字符串vertex2IDName=null;
字符串extra=null;
浮点数=0;
int vertex1ID=0;
int vertex2ID=0;
//逐行读取文件
而((line2=fileReader2.readLine())!=null)
{
//让所有可用的代币排队
String[]tokens2=line2.split(分隔符);
vertex1IDName=tokens2[0];
vertex2IDName=tokens2[1];
valueString=tokens2[2];
if(tokens2.length-1==3){
extra=tokens2[tokens2.length-1];
}
否则{
额外=”;
}
vertex1ID=Integer.parseInt(vertex1IDName);
vertex2ID=Integer.parseInt(vertex2IDName);
value=Float.parseFloat(valueString);
顶点v1=新顶点(0,“”);
顶点v2=新顶点(0,“”);
if(垂直排气口容器(垂直1ID)){
v1=Vertexh.get(vertex1ID);
}
else if(vertex1ID!=0&(VertexHash.containsKey(vertex1ID)==false)){
v1.setID(vertex1ID);
}
if(垂直排气口容器(垂直2ID)){
v2=VertexHash.get(vertex2ID);
}
else if(vertex2ID!=0&(VertexHash.containsKey(vertex2ID)==false)){
v2.setID(vertex2ID);
}
如果(v1.getID()!=0&&v2.getID()!=0){
边缘[索引边缘]=新边缘(值,v1,v2,额外);
EdgeHashStart.put(v1.getID(),edge[indexEdge]);
put(v2.getID(),edge[indexEdge]);
v1.添加邻居(边[indexEdge]);
//将v2添加为邻居只是将正在“x”上工作的actualVertex添加到adj列表中
//v2.添加邻居(边[索引边]);
图.附加值(值,v1,v2,额外);
indexEdge++;
}   
} 
fileReader2.close();
返回图;
}
公共顶点计算目标(){
扫描仪scanUserInput=新扫描仪(System.in);
System.out.println(“输入目的地名称:”);
字符串destinationName=scanUserInput.nextLine();
scanUserInput.close();
顶点目标=新顶点(0,空);
对于(int i=0;i请发布.Hard code测试数据,而不是从我们不可用的文件中读取。请发布.Hard code测试数据,而不是从我们不可用的文件中读取。