ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dijkstra

2022-05-07 10:04:44  阅读:129  来源: 互联网

标签:const weight int queue Dijkstra QNode dis


题目:
LeetCode 743. 网络延迟时间。给定无负边图,求信号从某一源点散播到所有点的最短时间。

分析:
单源最短路问题,这里用Dijkstra算法实现。有几个注意点:优先队列调用的>需要用友元函数,参数为const xx&;优先队列波认为大根堆。另外这里选用链式前向星存图。

代码:

const int MAXE = 6010;
const int MAXV = 110;
const int inf = 0x3f3f3f3f;

struct edge {
    int from, to, weight, next;
};

struct QNode {
    int v, dis;
    QNode(int v_, int dis_) :v(v_), dis(dis_) {}
    friend bool operator < (const QNode& lhs, const QNode& rhs) {
        return lhs.dis > rhs.dis;
    }
};

class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        for (auto time : times) {
            int u = time[0], v = time[1], weight = time[2];
            add_edge(u, v, weight);
        }
        memset(dis, inf, sizeof(dis));
        priority_queue<QNode> queue;
        queue.push(QNode(k, 0));
        dis[k] = 0;
        while (!queue.empty()) {
            QNode q = queue.top();
            queue.pop();
            if (vis[q.v])
                continue;
            vis[q.v] = 1;
            dis[q.v] = q.dis;
            for (int i = head[q.v]; i; i = edges[i].next) {
                if (!vis[edges[i].to]) {
                    queue.push(QNode(edges[i].to, q.dis + edges[i].weight));
                }
            }
        }
        int ma = 0;
        for (int i = 1;i <= n;i++) {
            if (dis[i] == inf) {
                ma = -1;
                break;
            }
            else {
                ma = max(ma, dis[i]);
            }
        }
        return ma;
    }

    int head[MAXV], tot, vis[MAXV], dis[MAXV];
    edge edges[MAXE];

    void add_edge(int u, int v, int weight) {
        edges[++tot] = { u,v,weight,head[u] };
        head[u] = tot;
    }
};

标签:const,weight,int,queue,Dijkstra,QNode,dis
来源: https://www.cnblogs.com/Unparalleled-Calvin/p/16241230.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有