算法java实现--分支限界法--单源最短路径问题

来源:互联网 发布:mac 自动字幕的播放器 编辑:程序博客网 时间:2024/05/17 22:18

单源最短路径问题的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;}@Overridepublic 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;前驱点是:13节点的最短距离是:50.0;前驱点是:44节点的最短距离是:30.0;前驱点是:15节点的最短距离是:60.0;前驱点是:3*/


0 0
原创粉丝点击