题解 | #单源最短路#

单源最短路

https://www.nowcoder.com/practice/9f15b34a2a944a7798a5340ff0dba8b7

class Solution {
public:
    int findShortestPath(int n, int m, vector<vector<int> >& graph) {
        // write code here
        /*单源最短路使用迪杰斯特拉算法。
        初始化时将S集中加入源点,并更新源点的邻接点的距离。
        往后扫描所有尚未加入S集的点,取距离最小者。每加入S集一个顶点,都要相应
        的尝试更新它的邻接点的值。(因为S集中新加入的顶点,只可能影响到它的邻接
        点的长度)*/
        if(graph.size()==0)
            return -1;
        //为每个顶点创建一个标志数组,记录其是否被加入到最短路中。
        vector<bool> flag(n);
        //表明现在每个节点距离节点1的最短距离。
        vector<int> dist(n);
        //对距离,flag数组进行初始化。距离都初始化为正无穷。
        for(int i=0;i<dist.size();i++)
        {
            dist[i]=INT_MAX;
            flag[i]=false;
        }
        //将源点加入进S集中。
        dist[0]=0;
        flag[0]=true;
        //将节点0的邻接点的距离初始化,同时考虑有重边的情况,重边时取最短边。
        for(auto edge:graph){
            if(edge[0]-1==0 && dist[edge[1]-1]>edge[2])
                dist[ edge[1]-1 ]=edge[2];
        }       
        
        while(1)
        {
            int mindistance=INT_MAX;
            int minIndex=-1;
            for(int i=0;i<dist.size();i++)
            {
                //在尚未加入S集的点中,寻找出一个距离最小的点来。
                if(dist[i]<=mindistance && flag[i]==false)
                {
                    minIndex=i;
                    mindistance=dist[i];
                }
            }
            //如果此时扫描出的结果发现剩余的点对S集来说是不可达的,就说明
            //这张图不是连通图,我们已经扫描完了这个连通分量了。
            if(mindistance==INT_MAX)
            {
                //判断目标点是否可达,或者说是否在该连通分量中。如果不在,返回-1
                if(dist[n-1]!=INT_MAX)
                    return dist[n-1];
                return -1;
            }

            //如果所有的点都加入到了S集中,就退出。
            if(minIndex==-1)
            {
                if(dist[n-1]!=INT_MAX)
                    return dist[n-1];
                return -1;
            }
            //遍历图,找出当前dist最小的节点的所有邻接边。
            for(auto edge:graph)
            {
                //由于在edge中记录的点是从1开始的,与数组中从0开始的差了1。所以要减一
                if( (edge[0]-1) == minIndex )
                {
                    //邻接点的下标。记得要减一
                    int adjoinIndex = edge[1]-1;
                    //如果将新点加入S集后,引起了该点的邻接点的最小距离变化,则更新
                    if(dist[adjoinIndex]>dist[minIndex]+edge[2])
                    {
                        dist[adjoinIndex]=dist[minIndex]+edge[2];
                    }
                }
            }
            flag[minIndex]=true;
        }
        return -1;
    }
};
多亏评论区有大佬提醒题目可能有重边……
另外如果要求输出路径的话还要加一个path数组,这个也比较简单。
全部评论

相关推荐

02-28 13:25
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
tongx_:海投吧同学,面试中能学到更多东西呢,比如拷打项目,要是觉得没准备好就可以从中厂开始呢,但是腾讯都是无限复活
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
9135次浏览 83人参与
# 你的实习产出是真实的还是包装的? #
1689次浏览 40人参与
# 米连集团26产品管培生项目 #
5632次浏览 214人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7398次浏览 42人参与
# 简历第一个项目做什么 #
31507次浏览 327人参与
# 重来一次,我还会选择这个专业吗 #
433312次浏览 3926人参与
# MiniMax求职进展汇总 #
23748次浏览 307人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186904次浏览 1120人参与
# 牛客AI文生图 #
21399次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152272次浏览 887人参与
# 研究所笔面经互助 #
118859次浏览 577人参与
# 简历中的项目经历要怎么写? #
309957次浏览 4189人参与
# AI时代,哪些岗位最容易被淘汰 #
63328次浏览 799人参与
# 面试紧张时你会有什么表现? #
30479次浏览 188人参与
# 你今年的平均薪资是多少? #
212986次浏览 1039人参与
# 你怎么看待AI面试 #
179809次浏览 1230人参与
# 高学历就一定能找到好工作吗? #
64296次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76415次浏览 374人参与
# 我的求职精神状态 #
447963次浏览 3128人参与
# 正在春招的你,也参与了去年秋招吗? #
363202次浏览 2637人参与
# 腾讯音乐求职进展汇总 #
160566次浏览 1110人参与
# 校招笔试 #
470114次浏览 2961人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务