1.最短路多解的时候,求节点数最少的
for(int j=0; j<n; j++)
{
if(!vis[j] && dl[j]>dl[p]+Gl[p][j])
{
dl[j]=dl[p]+Gl[p][j];
pathl[j]=p;
pathc[j]=pathc[p]+1;//开一个数组记录节点数
}
else if(!vis[j] && dl[j]==dl[p]+Gl[p][j])
{
if(pathc[j]>pathc[p]+1)
{
pathc[j]=pathc[p]+1;//多解时选择节点数少的那条
pathl[j]=p;
}
}
}
2.最短路每个边两个权值时,以其中一个跑最短路,当多解时以另一个最短为准
for(int j=0; j<n; j++)
{
if(!vis[j] && dt[j]>dt[p]+Gt[p][j])
{
dt[j]=dt[p]+Gt[p][j];
patht[j]=p;
pathd[j]=pathd[p]+Gl[p][j];//开一个数组记录另一个权值为标准的最短,相当于同时跑两个标准的最短路
}
else if(!vis[j] && dt[j]==dt[p]+Gt[p][j])
{
if(pathd[j]>=pathd[p]+Gl[p][j])
{
pathd[j]=pathd[p]+Gl[p][j];
patht[j]=p;
}
}
}//要注意的是,不能直接把第一个标准的最短路结果拿来用。
即,这样是不对的:
for(int j=0; j<n; j++)
{
if(!vis[j] && dt[j]>dt[p]+Gt[p][j])
{
dt[j]=dt[p]+Gt[p][j];
patht[j]=p;
}
else if(!vis[j] && dt[j]==dt[p]+Gt[p][j])
if(!vis[j] && dl[j]>=dl[p]+Gl[p][j])
patht[j]=p;
}