dijkstra的多解的情况

来源:互联网 发布:java面向过程实现加法 编辑:程序博客网 时间:2024/06/05 05:14

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;        }




原创粉丝点击