公路建厂最短路径问题

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.

 
 
时间: 2024-08-30 16:29:30

公路建厂最短路径问题的相关文章

最短路径(一)—Floyd-Warshall(只有五行的算法)

"多源最短路径"--计算任意两个城市之间的最短路径. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.公路是单向的.我们现在需要求任意两个城市之间的最短路径,也就是求任意两个点之间的最短路径.这个问题称为"多源最短路径"问题. 用4*4的矩阵存储图的信息,二维数组e存储. 之前通过dfs和bfs可以求出两点之间的最短路径.所以进行n^2遍深度或者广度优先搜索,即对每两个点都进行一次深度或者广度优先搜索,便可求的任意两点之间的最短路径. Floyd-Wars

最短路径-Floyd算法(转载)

暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向的.我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径.这个问题这也被称为"多源最短路径"问题. 现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储.比如1号城市到2号城市的路程为2,则设e[

最短路径算法集锦

/* Name: 最短路径算法集锦 Copyright: Author: 巧若拙 Date: 12/11/14 15:32 Description: 列举了深度优先搜索的递归和非递归算法,Dijkstra最短路径算法, 基于Bellman-Fort最短路径算法的改进型广度优先搜索算法, Floyd-Warshall最短路径算法的原始版和变化版 本文是阅读<啊哈!算法>后的学习笔记,代码与教材中有些差异,若有错误请指正,谢谢! 测试数据: 5 7 0 3 2 0 4 9 4 2 1 4 1 3

Floyd最短路径算法

暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向的.我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径.这个问题这也被称为“多源最短路径”问题. 现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储.比如1号城市到2号城市的路程为2,则设e[1][2]

多源最短路径---Floyd-Warshall算法

摘自啊哈算法-知识分享,代码自己有改动,使得输出更直观. 小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间没有,如下图.为了节省经费以及方便计划旅程,小哼希望出发之前知道任意两个城市之间的最短路程. 上图中有四个城市8条公路,公路上的数字表示该公路的长短.现在需要求任意两个城市之间的最短路径,也就是求任意两点之间的最短路径."多源路径最短"问题. 现在需要一个数据结构来存储图的信息,用一个4*4的矩阵来存储.比如城市1到城市2的路程为2,则设e[1][2]的值为2.2号城市无法

数据结构基础温故-5.图(下):最短路径

图的最重要的应用之一就是在交通运输和通信网络中寻找最短路径.例如在交通网络中经常会遇到这样的问题:两地之间是否有公路可通:在有多条公路可通的情况下,哪一条路径是最短的等等.这就是带权图中求最短路径的问题,此时路径的长度不再是路径上边的数目总和,而是路径上的边所带权值的和.带权图分为无向带权图和有向带权图,但如果从A地到B地有一条公路,A地和B地的海拔高度不同,由于上坡和下坡的车速不同,那么边<A,B>和边<B,A>上表示行驶时间的权值也不同.考虑到交通网络中的这种有向性,本篇也只讨

聊一聊多源最短路径问题(只有5行代码哦)

暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向的.我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径.这个问题这也被称为"多源最短路径"问题. 现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储.比如1号城市到2号城市的路程为2,则设e[

基于java最短路径算法公交查询系统的设计与实现

基于J2EE的公交查询系统的设计与实现 1引言 1.1 选题背景 20多年来,我国经济得到了持续.快速.稳定.健康地发展.经济的快速增长,带动了汽车工业的蓬勃发展,并使交通状况显著改善.据统计,中国公路通车总里程已达130余万公里,其中高速公路约1.5万公里.居民收入普遍提高,到2000年年底,人均GDP已超过800美元,沿海地区已达2000-3000美元.按国际发展惯例,当人均GDP超出1000美元,汽车消费市场就将进入快速增长期.我国城市人口约有2亿,略低于美国人口.东部沿海地区大部分居民已

浅入浅出数据结构(24)——最短路径问题

上一篇博文我们提到了图的最短路径问题:两个顶点间的最短路径该如何寻找?其实这个问题不应该叫"最短"路径问题,而应该叫"最便宜"路径问题,因为有时候我们会为图中的边赋权(weight),也叫权重,相当于经过一条边的"代价",一般为正数.比如下图(边旁的数字即该边的权重) 如果单纯考虑一条路径上边的条数,那么从v0到v6的最短路径应该是:v0-v3-v6.但是如果考虑边的权重,从v0到v6的"最便宜"路径应该是:v0-v1-v4-