知识回顾:
-
dijkstra算法
先求出一个的最短路径,然后一步一步求它们的最短路径
//求有向网G的V0顶点到其余顶点V的最短路径P[V]及带权长度D[v]
//P[V]的值为前驱顶点下标,D[v]表示V0到V的最短路径长度和
void ShortestPath_Dijkstra(MGraph G,int v0,Patharc *p,ShortPathTable *D)
{
int v,w,k,min;
int final[MAXVEX];//final[w]=1表示求得顶点V0至VW的最短路径
for(v=0;v<G.nummVertexes;v++)//初始化数据
{
final[v]=0;//全部顶点初始化为未知最短路径状态
(*D)[v]=G.arc[v0][v];//将与V0点有连线的顶点加上权值
(*p)[v]=-1;//初始化路径数组P为-1
}
(*D)[v0]=0;//V0至V0路径为0
final[v0]=1;//V0至V0不需要求路径
//开始主循环,每次求得V0到某个顶点v的最短路径
for(v=1;v<G.nummVertexes;v++)
{ min=INFINITY;//当前所知离V0顶点的最近距离
for(w=0;w<G.nummVertexes;w++)//寻找离V0最近的顶点
{
if(!final[w]&&(*D)[w]<min)
{
k=w;
min=(*D)[w];//w顶点离V0顶点更近
}
}
final[k]=1;//将目前找到的最近的顶点置为1
for(w=0;w<G.nummVertexes;w++)//修正当前最短路径及距离
{
//如果经过V顶点的路径比现在这条路径的长度短的话
if(!final[w]&&(min+G.arc[k][w]<(*D)[w]))
{//说明找到了更短的路径,修改D[w]和P[w]
(*D)[w]=min+G.arc[k][w];//修改当前路径长度
(*P)[w]=k;
}
}
}
}
题目引入:
迷宫问题
在给定区域内,找到一条,或者从某个位置到另一个位置的移动路线。
可以类比走迷宫,不过是求最优解
一个动态演示
寻路.js (qiao.github.io)https://qiao.github.io/PathFinding.js/visual/
这个还挺有趣,能够直观感受不同方式所产生的不同效果