利用DP求解最短路径
可套用Assembly Lines问题解法
附上源代码JAVA版
1 package second; 2 public class SP { 3 static int x=100000;//两点之间没路,路径长度设为无穷大 4 static int max=100000; 5 int data[][]=new int[10][10];//边的全值 6 static int[]dist=new int[10];//记录最短路径的值 7 static int path[]=new int[10];//记录最短路径 8 public static void fpath(int a[][])//求最短路径的值 9 { 10 int i,j,k; 11 dist[0]=0; 12 for(i=1;i<10;i++) 13 { 14 k=max; 15 for(j=0;j<i;j++) 16 { 17 if(a[j][i]!=x) 18 if((dist[j]+a[j][i])<k) 19 k=dist[j]+a[j][i]; //dist[1]+a[1,4]=4+10=14 20 } //dist[2]+a[2,4]=2+6=8 8<14 dist[4]=8 到节点4的最短路径 21 dist[i]=k; 22 } 23 } 24 static int froute(int a[][])//求最短路径 25 { 26 int j,b,k=1,i=9; 27 path[0]=10; 28 while(i>0) 29 { 30 for(j=i-1;j>=0;j--) 31 { 32 if(a[j][i]!=x) 33 { 34 b=dist[i]-a[j][i];// 35 if(b==dist[j])//如果b的值等于到j的最短路径 36 { 37 path[k++]=j+1;//数组从0开始,j+1与图中圈里的标号对应path[k]=j+1这个点,然后k++ 38 i=j; 39 40 } 41 } 42 43 } 44 } 45 return k; 46 } 47 48 public static void main(String[] args) 49 { 50 int i,m; 51 int[][] A ={ 52 {x,4,2,3,x,x,x,x,x,x},//A[j][i]表示点j到点i的代价 53 {x,x,x,x,10,9,x,x,x,x}, 54 {x,x,x,x,6,7,10,x,x,x}, 55 {x,x,x,x,x,3,8,x,x,x}, 56 {x,x,x,x,x,x,x,4,8,x}, 57 {x,x,x,x,x,x,x,9,6,x}, 58 {x,x,x,x,x,x,x,5,4,x}, 59 {x,x,x,x,x,x,x,x,x,8}, 60 {x,x,x,x,x,x,x,x,x,4}, 61 {x,x,x,x,x,x,x,x,x,x},}; 62 fpath(A); 63 System.out.print(dist[9]); 64 System.out.println(""); 65 m=froute(A); 66 for(i=m-1;i>0;i--) 67 System.out.print(path[i]+"->"); 68 System.out.print(path[0]); 69 70 } 71 72 73 }
问题
1.public static void main(String[] args)主函数格式改了直接就没法run;
2.给定义数组规定每行每列有多少int data[][]=new int[10][10];
3.静态数组定义方式:static int[]dist=new int[10];
4.NullPointerException数组长度未初始化;
参考:http://www.cnblogs.com/lpshou/archive/2012/04/17/2453370.html