最短路径算法思想2:
(1)按顺序找到一条路径leng,但是这条路径的第一个景点不能是3,并记录在min,min=leng。
(2)接着找下一条路径leng,这条路径的第一个景点也不能是3,这条路径leng与路径min比较。如果leng<=min,则把leng记录在min,min=leng,否则什么也不做。
(3)重复(2),直到把所有的路径都找出来,最后的min一 定是最短的路径。
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 || i2==3 ) //第一个景点不能是森林小剧场 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); } }
最短路径为:0->2->4->3->5->1->6->7
最短路径长度为:2000