题解 | #【模板】单源最短路2#

【模板】单源最短路2

https://www.nowcoder.com/practice/7c1740c3d4ba4b3486df4847ee6e8fc7

本题使用邻接矩阵进行建图,使用Dijkstra算法求单源最短路。

1.建图:本题图中的顶点数已经给定固定值N = 5000,因此使用二维数组G[N + 1][N + 1]作为邻接矩阵进行建图,两点间无连接时使用无穷大(程序中使用INT_MAX)表示。同时本题为无向图,因此建图时需要注意邻接矩阵关于主对角线对称。

2.求解单源最短路:使用Dijkstra算法(即不断从未处理集合中找当前距离源点最近的顶点以添加到已处理集合中,直至未处理集合为空的算法思想)。
首先需要定义一个dist数组用于存储每个顶点当前与源点(出发点)的最短距离(权值),还需要定义一个flag数组用于记录每个顶点是否已经完成与源点最短距离的计算处理(即标识了是否添加到了已处理集合中)。
初始时将dist数组设置为邻接矩阵G中源点所在行的权值,将flag数组全部设置为false,之后将源点位置的dist值设置为0flag设置为true,表示将源点加入已处理集合且与源点的距离为0。之后循环顶点数减一(除源点外的其他顶点)次,每次找到未处理集合中距离源点最近的顶点,将其flag值设置为true(即加入已处理集合中),之后再使用 该距离加上该顶点与其他未处理集合中的顶点的距离源点与其他未处理集合中的顶点的距离 相比较,更新距离的最短值。
最终判断dist[n]处的结果是否为无穷大,若是表示无法到达输出-1,若否则直接输出即为最短距离。

#include<iostream>
#include<climits> // 使用INT_MAX所需要引入的头文件
using namespace std;
int main()
{
    const int N = 5000; // 注意题干,图的点数是固定值5000
    int G[N + 1][N + 1]; // 用于模拟邻接矩阵进行建图
    for(int i = 1; i <= N; i++)
    {
        for(int j = 1; j <= N; j++)
        {
            G[i][j] = INT_MAX; // 先将邻接矩阵全部初始化为无穷大
        }
    }
    int n, m;
    cin>>n>>m;
    int u, v, w;
    for(int i = 1; i <= m; i++)
    {
        cin>>u>>v>>w;
        G[u][v] = w;
        G[v][u] = w; // 注意为无向图,需要关于主对角线对称,因此两边都需要存储
    }
    int dist[N + 1]; // 用于存储每个顶点当前与源点的最短距离
    bool flag[N + 1]; // 用于记录每个顶点是否已经完成与源点最短距离的计算处理
    for(int i = 1; i <= N; i++)
    {
        dist[i] = G[1][i]; // 初始设置为邻接矩阵中源点所在 行 的权值
        flag[i] = false;
    }
    dist[1] = 0;
    flag[1] = true; // 将源点加入已处理集合
    for(int i = 2; i <= N; i++)
    {
        int tmp = INT_MAX, index = 1;
        for(int j = 1; j <= N; j++) // 遍历寻找与源点的最短距离
        {
            if(flag[j] == false && dist[j] < tmp)
            {
                tmp = dist[j];
                index = j;
            }
        }
        if(index != 1)
        {
            flag[index] = true; // 找到后将其加入已处理集合
        }
        for(int j = 1; j <= N; j++)
        {
            if(flag[j] == false && G[index][j] != INT_MAX)
            {
                if(G[index][j] + dist[index] < dist[j])
                {
                    dist[j] = G[index][j] + dist[index]; // 新的距离比原距离更短,则进行更新
                }
            }
        }
    }
    if(dist[n] != INT_MAX)
    {
        cout<<dist[n];
    }
    else // 没有从源点到达该顶点的边
    {
        cout<<-1;
    }
    return 0;
}
全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
09-09 16:12
已编辑
成都理工大学 Java
future0210:学java就是好啊,啥都能转
点赞 评论 收藏
分享
评论
12
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务