Java 如何制作Dijkstra';双向s算法
目前,对于任何边(x,y),只有y顶点被添加到我的邻接列表中。如果我有另一条边(z,x),它只显示y是x的邻居,而y和z都应该是x的邻居。我尝试过使用两个哈希映射,一个用于起始顶点,一个用于结束顶点,然后合并这两个邻接列表,但这并没有改变任何事情。该示例当前位于我的CalculateSource()方法中,该方法是下面的方法之一。任何想法都非常感谢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
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测试数据,而不是从我们不可用的文件中读取。