很早就听说过A*算法,据说在寻路径时,是一种比较高效的算法。但是一直没有搞清楚原理。 这段时间刚好有个营救公主的例子: 题描述 : 公主被魔王抓走了 , 王子需要拯救出美丽的公主 。 他进
顺晟科技
2021-08-28 09:43:11
196
标题说明:
求解给定图形、每个给定顶点之间的路径长度、图形一个节顶点到任意节顶点的最短距离。
解决问题的想法:
戴尔使用Dijkstra算法解决最短路径,Dijkstra算法使用宽度优先搜索和贪心策略解决单一源最短路径。选择最接近起始顶点的顶点,以该顶点为中心调整起始顶点到周围顶点的最短距离,并继续重复和修改起始顶点到任何顶点的权重,直到完成修改。
示例图标:
详细的故障排除步骤:
1.将每个顶点之间的路径长度信息存储在二维数组中,然后确定起点,并调用参数获取最短路径的方法。
公共静态voidmain (string [] args)
{
Test Test=new Test();
Int MAX=Integer。MAX _ VALUE-10000;
Int[][] weight={
{0,1,12,max,max,max},
{MAX,0,9,3,MAX,MAX},
{MAX,MAX,0,MAX,5,MAX},
{4,0,13,15,MAX,MAX},
{MAX,MAX,MAX,MAX,0,4},
{MAX,MAX,MAX,MAX,MAX,0}
}
Int Start=0;//选择起点
int[]sp=test . getshortpath(weight,start);
system . out . print ln(arrays . tostring(sp));
}
2、定义存储每个顶点是否已访问的数组。初始化为0。因为我们从节点0出发,将0号顶点设置为访问。
int[]visit=new int[weight . length];//显示节点是否可访问
FOR(Int I 3360 Visit)///最初标记为未访问
visit[I]=0;
Visit [开始]=1;
3、分别访问循环中的每个顶点,并继续修改权重。
FOR(INT K=1;K=weight . length-1;K) //确定循环中最短路径的新节点,一次一个
1
4、选择不可见且最接近起点的顶点。
Int dmin=Integer。MAX _ VALUE
int position=0;
//寻找最接近起点的未显示节点
FOR(INT I=0;Iweight.lengthI)。
{
if(visit[I]==0 weight[start][I]dmini!=start)
{
DMIN=Weight[Start][I];
位置=I;
}
}
System.out.println('选择最短路径:' dmin '位置:' position);
//表示节点已被访问
Visit [位置]=1;
5、修改从出发顶点经过这个顶点到其他顶点的最短路径。
FOR(INT I=1;Iweight.lengthI)。
{
if(weight[start][position]weight[position][I]weight[start][I]I!=位置)
{
System.out.println('以前的最短路径到' I '距离为3360 ' weight[start][I]);
System.out.println('两者' weight [start] [position],' weight[position][I]);
weight[start][I]=weight[position][I]weight[start][position];//最短路径更新
System.out.println(“更新最短路径”I’距离为3360’weight[start][I]);
}
}
6、循环,直到所有顶点都被访问。最后,获取并返回从出发顶点到每个顶点的最短路径阵列。
int[]shortpath=new int[weight . length];
FOR(INT I=0;Iweight.lengthI)。
ShortPath[I]=weight[0][I];
Return shortPath
运行结果:
[0,1,10,4,15,19]
顶点到自身的最短路径为0,其余顶点的最短路径分别为1、10、4、15、19。
28
2021-08
28
2021-08
28
2021-08
28
2021-08
28
2021-08
28
2021-08