演算法java實現--分支限界法--單源最短路徑問題
阿新 • • 發佈:2019-02-14
單源最短路徑問題的java實現(分支限界法)
具體問題描述以及C/C++實現參見網址
http://blog.csdn.net/liufeng_king/article/details/8900872
import java.util.Collections; import java.util.LinkedList; import java.util.Scanner; /** * 單源最短路徑問題--分支限界法 * @author Lican * */ public class BBShortest { public static class Heapnode implements Comparable{ int id;//頂點編號 float length;//當前路長 public Heapnode(int ii,float ll){ id=ii; length=ll; } @Override public int compareTo(Object x) { float xl=((Heapnode)x).length; if(length<xl) return -1; if(length==xl) return 0; return 1; } } public static void shortest(float[][] a,int v,float[] dist,int[] p){ //dist[j]儲存從源到頂點j的距離;p[j]記錄從源到頂點j的路徑上的前驅頂點 int n=p.length-1; LinkedList<Heapnode> nodes=new LinkedList<Heapnode>();//用LinkedList儲存最小堆 Heapnode enode=new Heapnode(v,0); for(int j=1;j<=n;j++){ dist[j]=Float.MAX_VALUE; } while(true){//搜尋問題解空間 for(int j=1;j<=n;j++){ if(a[enode.id][j]!=-1&&enode.length+a[enode.id][j]<dist[j]){ //頂點i到j可達,同時長度小於dist[j] dist[j]=enode.length+a[enode.id][j]; p[j]=enode.id; Heapnode e=new Heapnode(j,dist[j]); nodes.add(e); Collections.sort(nodes); } } //取下一個擴充套件結點 if(nodes.isEmpty()) break; else{ enode=(Heapnode) nodes.poll(); } } for(int i=2;i<=n;i++){ System.out.println(i+"節點的最短距離是:"+dist[i]+";前驅點是:"+p[i]); } } public static void main(String[] args) { System.out.println("請輸入圖頂點的個數:"); Scanner sc = new Scanner(System.in); String line = sc.nextLine(); int n = Integer.parseInt(line); System.out.println("請輸入圖的路徑長度:"); float[][] a = new float[n+1][n+1];//下標從1開始,以下都是 float[] dist = new float[n+1]; int[] prev = new int[n+1]; for(int i=0;i<n;i++){ line = sc.nextLine(); String[] ds = line.split(","); for(int j = 0;j<ds.length;j++){ a[i+1][j+1]=Float.parseFloat(ds[j]); } } int v =1;//頂點從1開始 shortest(a,v,dist,prev); } } /** * 以下為輸入輸出 * * 輸入: 5 -1,10,-1,30,100 -1,-1,50,-1,-1 -1,-1,-1,-1,10 -1,-1,20,-1,60 -1,-1,-1,-1,-1 * 輸出: 2節點的最短距離是:10.0;前驅點是:1 3節點的最短距離是:50.0;前驅點是:4 4節點的最短距離是:30.0;前驅點是:1 5節點的最短距離是:60.0;前驅點是:3 */