1. 程式人生 > >演算法java實現--分支限界法--單源最短路徑問題

演算法java實現--分支限界法--單源最短路徑問題

單源最短路徑問題的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
*/