JAVA 最短路径

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

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



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);
	}

}

猜你喜欢

转载自blog.csdn.net/abc1498880402/article/details/80209419