Как сделать алгоритм Дейкстры двунаправленным - PullRequest
1 голос
/ 02 марта 2020

В настоящее время для любого Edge (x, y) в мой список смежности добавляется только вершина y. Если бы у меня был другой Edge (z, x), он только показывает, что y является соседом x, тогда как y и z должны быть соседями x. Я попытался использовать два хеш-карты, один для начальной вершины, один для конечной вершины, а затем объединить эти два списка смежности, но это ничего не изменило. Этот пример в настоящее время находится в моем методе CalculatesSource (), одном из методов ниже. Любые идеи с благодарностью!

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...