pascal
PROCEDUREDIJKSTRA;
VAR
DIST:ARRAY[1..MAXP]OFLONGINT;{距离数组,记录目前从源点出发已经找到的最短路径长度}
VISITED:ARRAY[1..MAXP]OFBOOLEAN;{标志数组,记录是否已经找到了某一点的最终最短路径}
I,J,MIN,MINP:LONGINT;
BEGIN
FILLCHAR(VISITED,SIZEOF(VISITED),FALSE);{初始化源点和路径数组}
FORI:=1TOMAXPDO
BEGIN
DIST:=MAP[SOURCE,I];
IFDIST
PATH:=SOURCE
ELSE
PATH:=0;
END;{源点的最短路径肯定是不用找的...}
VISITED[SOURCE]:=TRUE;
{DIJKSTRA的思想是按递增长度来产生路径,每次选出当前已经
找到的最短的一条路径,它必然是一条最终的最短路径.因此
每次找出当前距离数组中最小的,必然是一条最终的最短路径}
FORI:=2TOMAXPDO
BEGIN
MIN:=INFINITY;
MINP:=0;
FORJ:=1TOMAXPDO
IF(NOTVISITED[J])AND(DIST[J]
BEGIN
MIN:=DIST[J];
MINP:=J;
END;{已找到源点到点MINP的最短路径,做上标志}
VISITED[MINP]:=TRUE;{修改距离数组}
FORJ:=1TOMAXPDO
IF(NOTVISITED[J])AND(DIST[MINP]+MAP[MINP,J]
BEGIN
DIST[J]:=DIST[MINP]+MAP[MINP,J];
PATH[J]:=MINP;
END;
END;
END;
Dijkstra算法的实现(c++)
//Computeshortestpathdistancesfroms,returntheminD
voidDijkstra(Graph*G,int*D,ints){//这里的s是指计算最小路径的源,但是题目中没有
用到,应该加一个
//初始化数组D的函数
/*
for(inti=0;in();i++){//仅供参考(本来这个初始化应该在传入时候就做好的,但是为了符合这个函数)
if(i==s)D[i]=0;
elseD[i]=INFINITY;
}
*/
inti,v,w;
for(i=0;in();i++){//Processthevertices
v=minVertex(G,D);
if(D[v]==INFINITY)return;//Unreachablevertices
G->setMark(v,VISITED);
for(w=G->first(v);wn();w=G->nexr(v,w))
if(D[w]>(D[v]+G->weight(v,w)))
D[w]=D[v]+G->weight(v,w);
}
}
intminVertex(Graph*G,int*D){//找出最小的点
inti,v;
for(i=0;in;i++){//找没有被访问的点
if(G->getMark(i)==UNVISITED){
v=i;break;
}
}
for(i++;in;i++){//找比上面还小的未被访问的点(注意此时的i++)
if((G->getMark(i)==UNVISITED)&&D[i]
v=i;
returnv;
}
//还有Graph类没有给出
pascal
PROCEDUREDIJKSTRA;
VAR
DIST:ARRAY[1..MAXP]OFLONGINT;{距离数组,记录目前从源点出发已经找到的最短路径长度}
VISITED:ARRAY[1..MAXP]OFBOOLEAN;{标志数组,记录是否已经找到了某一点的最终最短路径}
I,J,MIN,MINP:LONGINT;
BEGIN
FILLCHAR(VISITED,SIZEOF(VISITED),FALSE);{初始化源点和路径数组}
FORI:=1TOMAXPDO
BEGIN
DIST:=MAP[SOURCE,I];
IFDIST
PATH:=SOURCE
ELSE
PATH:=0;
END;{源点的最短路径肯定是不用找的...}
VISITED[SOURCE]:=TRUE;
{DIJKSTRA的思想是按递增长度来产生路径,每次选出当前已经
找到的最短的一条路径,它必然是一条最终的最短路径.因此
每次找出当前距离数组中最小的,必然是一条最终的最短路径}
FORI:=2TOMAXPDO
BEGIN
MIN:=INFINITY;
MINP:=0;
FORJ:=1TOMAXPDO
IF(NOTVISITED[J])AND(DIST[J]
BEGIN
MIN:=DIST[J];
MINP:=J;
END;{已找到源点到点MINP的最短路径,做上标志}
VISITED[MINP]:=TRUE;{修改距离数组}
FORJ:=1TOMAXPDO
IF(NOTVISITED[J])AND(DIST[MINP]+MAP[MINP,J]
BEGIN
DIST[J]:=DIST[MINP]+MAP[MINP,J];
PATH[J]:=MINP;
END;
END;
END;
Dijkstra算法的实现(c++)
//Computeshortestpathdistancesfroms,returntheminD
voidDijkstra(Graph*G,int*D,ints){//这里的s是指计算最小路径的源,但是题目中没有
用到,应该加一个
//初始化数组D的函数
/*
for(inti=0;in();i++){//仅供参考(本来这个初始化应该在传入时候就做好的,但是为了符合这个函数)
if(i==s)D[i]=0;
elseD[i]=INFINITY;
}
*/
inti,v,w;
for(i=0;in();i++){//Processthevertices
v=minVertex(G,D);
if(D[v]==INFINITY)return;//Unreachablevertices
G->setMark(v,VISITED);
for(w=G->first(v);wn();w=G->nexr(v,w))
if(D[w]>(D[v]+G->weight(v,w)))
D[w]=D[v]+G->weight(v,w);
}
}
intminVertex(Graph*G,int*D){//找出最小的点
inti,v;
for(i=0;in;i++){//找没有被访问的点
if(G->getMark(i)==UNVISITED){
v=i;break;
}
}
for(i++;in;i++){//找比上面还小的未被访问的点(注意此时的i++)
if((G->getMark(i)==UNVISITED)&&D[i]
v=i;
returnv;
}
//还有Graph类没有给出