Java最短路径类型_JAVA 最短路径

1.从景石出发,步行游览以下景点:①游客服务中心,②阳光草坪,③森林小剧场,④儿童科普体验区,⑤儿童戏水场,⑥湿地博物馆,⑦湿地商业街。建立数学模型,找出从景石出发,到达⑦湿地商业街,并且经过①—⑥所有景点至少1次的距离最短的路线,计算该路线的长度。注:在每个景点不用停留。

任意两个景点之间的最短步行距离如表1给出。

ba3cd044b6f9de7f07265639a3ca3771.png

3f9425c70e7e1fa4d4936a1291ae40d4.png

0~7 分别表示景石、游客服务中心、阳光草坪、森林小剧场、儿童科普体验区、儿童戏水场、湿地博物馆、湿地商业街。

假定每个景点只经过一次,起点为景石,终点为湿地商业街,所以路线一共有6!=720条。

算法思想:

(1)按顺序找到一条路径leng并记录在min,min=leng。

(2)接着找下一条路径leng,这条路径leng与路径min比较。如果leng<=min,则把leng记录在min,min=leng,否则什么也不做。

(3)重复(2),直到把所有的路径都找出来,最后的min一定是最短的路径。

最短的路径为:0->3->5->1->2->4->6->7

最短路径的长度为:1820

public class LinkList {

public static void main(String[] args) {

int leng=0; //总路程

int min=10000; //最短路程,初始化为10000

//把景点之间的最短步行距离赋值到a[][]

int [][] a=new int[8][8];

a[0][0]=0 ;a[0][1]=300;a[0][2]=360;a[0][3]=210;a[0][4]=590;a[0][5]=475;a[0][6]=500;a[0][7]=690; //a[0][1]表示景石到游客服务中心的距离为300,之后的亦然

a[1][0]=300;a[1][1]=0 ;a[1][2]=380;a[1][3]=270;a[1][4]=230;a[1][5]=285;a[1][6]=200;a[1][7]=390;

a[2][0]=360;a[2][1]=380;a[2][2]=0 ;a[2][3]=510;a[2][4]=230;a[2][5]=765;a[2][6]=580;a[2][7]=770;

a[3][0]=210;a[3][1]=270;a[3][2]=510;a[3][3]=0 ;a[3][4]=470;a[3][5]=265;a[3][6]=450;a[3][7]=640;

a[4][0]=590;a[4][1]=230;a[4][2]=230;a[4][3]=470;a[4][4]=0 ;a[4][5]=515;a[4][6]=260;a[4][7]=450;

a[5][0]=475;a[5][1]=285;a[5][2]=765;a[5][3]=265;a[5][4]=515;a[5][5]=0 ;a[5][6]=460;a[5][7]=650;

a[6][0]=500;a[6][1]=200;a[6][2]=580;a[6][3]=450;a[6][4]=260;a[6][5]=460;a[6][6]=0 ;a[6][7]=190;

a[7][0]=690;a[7][1]=390;a[7][2]=760;a[7][3]=640;a[7][4]=450;a[7][5]=650;a[7][6]=190;a[7][7]=0 ;

int i1=0; //起点为景石

int i8=7; //终点为湿地商业街

int [] b=new int[8]; //记录景点,1为未游览,0为已游览

b[0]=0; //起点终点都已确定,所以先置为0

b[7]=0;

for(int i=1;i<7;i++)

b[i]=1;

int [] c=new int[8]; //用来记录路径

for(int i2=1;i2<7;i2++)

{

if(b[i2]==0) //如果已走过,就不能再走了

continue; //

b[i2]=0;

leng=leng+a[i1][i2]; //把走过的路的路程加起来

for(int i3=1;i3<7;i3++)

{

if(b[i3]==0)

continue;

b[i3]=0;

leng=leng+a[i2][i3];

for(int i4=1;i4<7;i4++)

{

if(b[i4]==0)

continue;

b[i4]=0;

leng=leng+a[i3][i4];

for(int i5=1;i5<7;i5++)

{

if(b[i5]==0)

continue;

b[i5]=0;

leng=leng+a[i4][i5];

for(int i6=1;i6<7;i6++)

{

if(b[i6]==0)

continue;

b[i6]=0;

leng=leng+a[i5][i6];

for(int i7=1;i7<7;i7++)

{

if(b[i7]==0)

continue;

b[i7]=0;

leng=leng+a[i6][i7];

leng=leng+a[i7][i8];

if(leng<=min) //如果存在更短的路径,就把更短的那条路径记录下来

{

min=leng;

c[0]=i1;c[1]=i2;c[2]=i3;c[3]=i4;c[4]=i5;c[5]=i6;c[6]=i7;c[7]=i8;

}

leng=leng-a[i6][i7];

leng=leng-a[i7][i8];

b[i7]=1;

}

leng=leng-a[i5][i6];

b[i6]=1;

}

leng=leng-a[i4][i5];

b[i5]=1;

}

leng=leng-a[i3][i4];

b[i4]=1;

}

leng=leng-a[i2][i3];

b[i3]=1;

}

leng=leng-a[i1][i2];

b[i2]=1;

}

System.out.println("最短路径为:"); //输出记录的最短路径的结果

System.out.print(c[0]);

for(int i=1;i<8;i++)

System.out.print("->"+c[i]);

System.out.print("\n");

System.out.println("最短路径长度为:"+min);

}

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值