利用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

原文地址:https://www.cnblogs.com/Ljj-Nancy/p/5396145.html