1. 程式人生 > >dijkstra演算法java實現

dijkstra演算法java實現

這段程式碼是在做牛客網的程式設計題的時候寫的,但是那道題要求出圖中兩點之間所有的最短路徑,目前我只實現了求出一條最短路徑的演算法。

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();
	}
}



測試用例:

執行結果:


根據程式結果畫出生成影象: