void shortestpath_dij(mgraph G,int v0,pathmatrix &p,shortpathtable &d)
{
//用dijkstra算法求有向图G的v0顶点到其余v的最短路径p[v]及其带权长度D[V]
//若p[v][w]为true,那么w是从v0到v当前求得最短路径上的点
//final[v]为true当且仅当v属于s,即已经求得从v0到v的最短路径
for(v=0;v<G.vexnum;v++)
{
final[v]=false;
d[v]=G.arcs[v0][v];
for(w=0;w<G.vexnum;w++)
p[v][w]=false; //设置空路径
if(d[v]<infinity)
{p[v][v0]=true;p[v][v]=true;} //???不明白
}
d[v0]=0;final[v0]=true;
//开始主循环,每次求得v0到某个v定点的最短路径,并且加v入到s集
for(i=1;i<G.vexnum;i++)
{
min=infinity; //infinity是无穷的大数
for(w=0;w<G.vexnum;w++)
if(!final[w])
if(d[w]<min) {v=w;min=d[w];}
final[v]=true;
for(w=0;w<G.vexnum;w++) //更新当前最短路径和距离 ??不明白
if(!final[w] && (min+G.arcs[v][w])<d[w])
{d[w]=min+G.arcs[v][w];
p[w]=p[v];
p[w][w]=true;
}
}
}
提问:
1.if(d[v]<infinity)
{p[v][v0]=true;p[v][v]=true;} // 为什么还要p[v][v0]=true呢?
2.for(w=0;w<G.vexnum;w++) //更新当前最短路径和距离
if(!final[w] && (min+G.arcs[v][w])<d[w])
{d[w]=min+G.arcs[v][w];
p[w]=p[v];
p[w][w]=true;
}
更新d[w]中的数据有什么用处呢?