公路建厂最短路径问题


The question:
  12个工厂分布在一条东西向高速公路的两侧,工厂距离公路最西端的距离分别是0、4、5、10、12、18、27、30、31、38、39、47.
  在这12个工厂中选取3个原料供应厂,使得剩余工厂到最近的原料供应厂距离之和最短,问应该选哪三个厂 ?


The code:
 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     
 5     
 6     public static void main(String[] argv){        
 7         Scanner in = new Scanner(System.in);
 8         // 存放结果....
 9         int min_start=0;
10         int min_end=0;
11         int min_RESULT=0;
12         
13         //输入.....
14         int M =in.nextInt();
15         int[] s = new int[M];
16         for(int i=0; i<M; i++){
17             s[i]=in.nextInt();
18         }
19         in.close();
20         
21         //处理....
22         int[][] F_length = new int [M][2];      //如果选单个 第i个点建厂  F_length[i][0]即左边到厂的距离和      F_length[i][1]即右边到厂的距离和 
23         for(int j=0; j<M; j++){
24             int sum_0=0;
25             int sum_1=0;
26             if(j==0){            
27                 for(int k=0; k<M; k++){
28                     if(j>=k)
29                         sum_0=sum_0+s[j]-s[k];
30                     else
31                         sum_1=sum_1+s[k]-s[j];            
32                 }                    
33             }
34             else{
35                 sum_0=F_length[j-1][0]+j*(s[j]-s[j-1]);
36                 sum_1=F_length[j-1][1]-(M-j)*(s[j]-s[j-1]);                
37             }
38             
39             F_length[j][0]=sum_0;
40             F_length[j][1]=sum_1;
41             //System.out.println(" "+j+":  "+sum_0+"     "+sum_1);
42         }
43         //获取建两个厂的结果
44         int[][] result = new int[M][M];          //如果选两个 第i,k个点建厂  result[i][k]即所有点到最近厂的距离和  
45         for(int i=0; i<M;i++){
46             
47             for(int j=i+1; j<M; j++){
48                 result[i][j]=F_length[i][0]+F_length[j][1];
49                 for(int t=i+1;t<j;t++){
50                     int x= s[t]-s[i];
51                     int y= s[j]-s[t];
52                     if(x>y)
53                         x=y;
54                     result[i][j]=result[i][j]+x;                    
55                 }
56                 if(min_RESULT==0||min_RESULT>result[i][j]){
57                     min_start=i;
58                     min_end=j;
59                     min_RESULT=result[i][j];    
60                 }
61                 /*
62                 else{
63                     if(min_RESULT>result[i][j]){
64                         min_start=i;
65                         min_end=j;
66                         min_RESULT=result[i][j];
67                     }
68                         
69                 }*/
70                                     
71                 System.out.println(" "+i+" "+j+" "+result[i][j]);
72             }    
73             
74         }
75         
76         System.out.println("The first is "+min_start+".");
77         System.out.println("The second is "+min_end+".");
78         System.out.println("The length is "+min_RESULT+".");
79     
80    }
81 }

测试用例:

/*
12
0
4
5
10
12
18
27
30
31
38
39
47
*/

Result: 

The first is 2.
The second is 8.
The length is 67.

 
 
posted @ 2015-08-12 17:11  UDLD  阅读(291)  评论(0编辑  收藏  举报