当前位置: 首页 > news >正文

堆优化版dijkstra算法

堆优化的dijkstra算法用于稀疏图,也就是m~n级别的图,算法时间复杂度O(mlog(n))

vis数组的用处:堆优化是按照距离来进行排序,可能会出现距离已经被优化的点,和原先没被优化的距离同时进入了堆,也就是堆内的元素数实际上不等于顶点数,而是边数,vis就是为了处理上述可能被重复更新的点

#pragma optimize(2)
#include<bits/stdc++.h>
#include<unordered_map>
#define endl '\n'
#define int int64_t
using namespace std;
const int  N = 1e5 + 10;
struct edge { int v, w; };
vector<edge>e[N];
int d[N],vis[N],m,n,s;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>q;
void dijkstra(int s) {
    for (int i = 0; i <= n; ++i) d[i] = INT_MAX;
    d[s] = 0; q.push({ 0,s });
    while (q.size()) {
         int u = q.top().second; q.pop();
         if (vis[u]) continue;
         vis[u] = 1;
         for (auto k : e[u]) {
             if (d[k.v] > d[u] + k.w) {
                   d[k.v] = d[u] + k.w;
                   q.push({ d[k.v],k.v });
               }
         }
    }
}
signed main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n >> m >> s;
    for (int i = 1; i <= m; ++i) {
         int a, b, c; cin >> a >> b >> c;
         e[a].push_back({ b,c });
    }
    dijkstra(s);
    for (int i = 1; i <= n; ++i) cout << d[i] << " ";
    return 0;
}

相关文章:

  • Nignx及负载均衡动静分离
  • golang中快速用melody搭建轻量的websocket服务
  • 【计算机网络笔记】传输层——可靠数据传输之流水线机制与滑动窗口协议
  • Linux学习第28天:Platform设备驱动开发(二): 专注与分散
  • 【数据结构】树形结构所有路径复原为链表
  • AR眼镜定制开发-智能眼镜的主板硬件、软件
  • 如何确认目标期刊被SCI或EI收录?
  • vue element el-table-column 循环示例代码
  • 如何将 ruby 打包类似于jdk在另一台相同架构的机器上面开箱即用
  • API商品数据接口调用
  • 【广州华锐互动】飞机诊断AR远程指导系统为工程师提供更多支持
  • 3D数据过滤为2D数据集并渲染
  • LeetCode|动态规划|1035. 不相交的线 、53. 最大子数组和
  • 【智能座舱系列】- 深度解密小米Hyper OS,华为HarmonyOS区别
  • 前端CSS
  • 数据结构学习笔记——链式表示中的双链表及循环单/双链表
  • 第19期 | GPTSecurity周报
  • 【计算机视觉】3D视觉
  • kkfileview安装部署Linux(CentOS、Debian)
  • 中文编程工具免费版下载,中文开发语言工具免费版下载
  • 临武县网站建设/百度软件开放平台
  • 简阳建设厅官方网站/北京seo公司助力网络营销
  • 天津网站建设市场/深圳百度推广电话
  • 湖州做网站推广的公司/女生seo专员很难吗为什么
  • 深圳做网站哪家好/南京疫情最新情况
  • 增城网络推广/杭州网站优化公司哪家好