这几天学到数据结构的图,被这个Dijkstra绕的有点晕。
直接放代码:
void Graph::Dijstra(int v0)
{
s[v0]=true;
for (int i=0;i<vexnum;++i)
{
dist[i]=AdjList[v0][i];
s[i]=false;
if (dist[i]==MAXINT)
prev[i]=-1;
else
prev[i]=v0;
}
dist[v0]=0;
for (int i=1;i<MAX;++i)
{
int min=MAXINT;
int u=v0;
// 添加一个节点
for (int j=0;j<MAX;++j)
{
if (!s[j]&&dist[j]<min)
{
u=j;
min=dist[j];
}
}
s[u]=true;
// 更新dist
for (int j=0;j<MAX;++j)
{
if (!s[j]&&AdjList[u][j]<MAXINT)
if (dist[u]+AdjList[u][j]<dist[j])
{
dist[j]=dist[u]+AdjList[u][j];
prev[j]=u;
}
}
}
}
自己的一些理解:
dist是在已知s中顶点所构成的路径的条件下,各顶点到v0的最小权值。
u,即将加入s的顶点,是min(dist[s以外顶点]),至于prev则保存的是在最短路径(v0为起点)前提下每个顶点的前驱(v0的前驱是-1)。
寻路的算法很容易实现,这里就不多说了。