dijkstra演算法java實現
阿新 • • 發佈:2019-01-08
這段程式碼是在做牛客網的程式設計題的時候寫的,但是那道題要求出圖中兩點之間所有的最短路徑,目前我只實現了求出一條最短路徑的演算法。
Vertex類儲存每一個節點的資訊:
distance(到源點的距離,初始時設為一個很大的值)
ID(該點的序號)
prior(記錄找到最小路徑後改點前一個點的ID號)
edge類作為Vertex的一個屬性儲存該節點所有的出度邊及權重。
初始的節點資訊儲存在ListofVertex 中,演算法執行中每求出一個節點到原點的最短路徑就把這個節點加入VertexOnLink中,有可能求出的最短路徑的節點已經在VertexOnLink中,這種情況會更新VertexOnLink中的資訊。
Vertex類:
package testcode; import java.util.ArrayList; import java.util.List; public class Vertex { public int d,p,ID,current; public List<Edge>edge = new ArrayList(); public Vertex(int D,int id,int c){ d=D; p=101; ID=id; current=c; } public Vertex(int id,int c){ d=10000; p=101; ID=id; current=c; } }
Edge類:
package testcode;
public class Edge {
public int head,tail,weight;
public Edge(){
}
public Edge(int h,int t){
this.head=h;
this.tail=t;
}
public Edge(int h,int t,int w){
this.head=h;
this.tail=t;
this.weight=w;
}
}
Main類:
package testcode; import java.util.ArrayList; import java.util.Scanner; public class Main { public int capacity,N,indexOfProblem,road; public ArrayList<Vertex>ListofVertex = new ArrayList(); public ArrayList<Vertex>VertexOnLink = new ArrayList(); public Scanner console; public Main(){ console = new Scanner(System.in); } public void getInfo(){ capacity = console.nextInt(); N = console.nextInt(); indexOfProblem = console.nextInt(); road = console.nextInt(); ListofVertex.add(new Vertex(0,0,10000)); for(int i=1;i < N;i++){ ListofVertex.add(new Vertex(i,console.nextInt())); } for(int i=0;i < road;i++){ int[] e={0,0,0}; for(int j=0;j < 3;j++){ e[j]=console.nextInt(); } ListofVertex.get(e[0]).edge.add(new Edge(e[0],e[1],e[2])); ListofVertex.get(e[1]).edge.add(new Edge(e[1],e[0],e[2])); } } public void dijkstra(){ VertexOnLink.add(ListofVertex.get(0)); VertexOnLink.get(0).d=0; while(VertexOnLink.size() < N){ int hid=101,tid=101,minWeight=10000,minDistance=1000000,edge=10000; for (Vertex v : VertexOnLink) { for (int j=0;j < v.edge.size();j++){ Edge e = v.edge.get(j); if((e.weight + v.d <= minDistance) && (v.p != e.tail)){ minDistance=e.weight+v.d; minWeight=e.weight; hid=e.head; tid=e.tail; edge=j; } } } ListofVertex.get(hid).edge.remove(edge); if((minWeight+ListofVertex.get(hid).d) < ListofVertex.get(tid).d){ ListofVertex.get(tid).p=hid; ListofVertex.get(tid).d=minWeight+ListofVertex.get(hid).d; VertexOnLink.add(ListofVertex.get(tid)); } } for (Vertex v : VertexOnLink) { System.out.println(v.ID+" "+v.p); } } public void adjust(){ } public static void main(String[] args) { // TODO Auto-generated method stub Main m = new Main(); m.getInfo(); m.dijkstra(); } }
測試用例:
執行結果:
根據程式結果畫出生成影象: