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

【Day50 LeetCode】图论问题 Ⅷ

一、图论问题 Ⅷ

1、dijkstra算法 堆优化

采用堆来优化,适合节点多的稀疏图。代码如下:

# include<iostream>
# include<vector>
# include<list>
# include<queue>
# include<climits>using namespace std;class mycomparison {
public:bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {return lhs.second > rhs.second;}
};int main(){int n, m;cin >> n >> m;int s, e, v;vector<list<pair<int, int>>> grid(n+1);for(int i=0; i<m; ++i){cin >> s >> e >> v;grid[s].push_back(pair<int, int>(e, v));}vector<int> minDist(n+1, INT_MAX);vector<bool> visited(n+1, false);int start = 1, end = n;minDist[start] = 0;priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pq;pq.push(pair<int, int>(start, 0));while(!pq.empty()){// 1、选取源点到未被访问过且距离最近的节点; auto cur = pq.top(); pq.pop();if(visited[cur.first])continue;// 2、将最近节点标记为访问过 visited[cur.first] = true;// 3、更新非访问节点到源点的距离for(auto edge : grid[cur.first]){if(!visited[edge.first] && minDist[edge.first] > minDist[cur.first] + edge.second )minDist[edge.first] = minDist[cur.first] + edge.second;pq.push(pair<int, int>(edge.first, minDist[edge.first]));}}if(minDist[end] < INT_MAX)cout << minDist[end] << endl;elsecout << -1 << endl;return 0;
}

2、Bellman_ford 算法

权值有负值的图无法采用dijdijkstra算法,这时需要使用Bellman_ford 算法来解决最短路问题。

#include <iostream>
#include <vector>
#include <list>
#include <climits>using namespace std;int main() {int n, m, p1, p2, val;cin >> n >> m;vector<vector<int>> grid;for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid.push_back({p1, p2, val});}int start = 1, end = n;  vector<int> minDist(n + 1 , INT_MAX);minDist[start] = 0;for (int i = 1; i < n; i++) { // 对所有边 松弛 n-1 次for (vector<int> &side : grid) { // 每一次松弛,都是对所有边进行松弛int from = side[0]; // 边的出发点int to = side[1]; // 边的到达点int price = side[2]; // 边的权值// 松弛操作 // minDist[from] != INT_MAX 防止从未计算过的节点出发if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) { minDist[to] = minDist[from] + price;  }}}if (minDist[end] == INT_MAX)cout << "unconnected" << endl; // 不能到达终点elsecout << minDist[end] << endl; // 到达终点最短路径return 0;
}

参考资料
代码随想录

http://www.lryc.cn/news/543803.html

相关文章:

  • 结构体介绍及内存大小分配问题
  • halcon 条形码、二维码识别、opencv识别
  • Vue框架的使用 搭建打包 Vue的安全问题(Xss,源码泄露)
  • Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)
  • day2 - SpringBoot框架开发技术
  • Flash-03
  • 新建菜单项的创建之CmpGetValueListFromCache函数分析
  • 【Word2Vec】Skip-gram 的直观理解(深入浅出)
  • 在MacOS上打造本地部署的大模型知识库(一)
  • (21)从strerror到strtok:解码C语言字符函数的“生存指南2”
  • DeepSeek推出DeepEP:首个开源EP通信库,让MoE模型训练与推理起飞!
  • 1.2 Kaggle大白话:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据
  • 数据结构-顺序表专题
  • docker和containerd从TLS harbor拉取镜像
  • kafka-关于ISR-概述
  • el-input实现金额输入
  • C++11智能指针
  • 安装Git(小白也会装)
  • 驭势科技9周年:怀揣理想,踏浪前行
  • 一款在手机上制作电子表格
  • Python解决“比赛配对”问题
  • 【AI论文】RAD: 通过大规模基于3D图形仿真器的强化学习训练端到端驾驶策略
  • Web开发:ORM框架之使用Freesql的导航属性
  • 【docker】namespace底层机制
  • 【每天认识一个漏洞】url重定向
  • 端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port
  • Polardb开发者大会
  • 从二维随机变量到多维随机变量
  • Vulnhub靶场 Kioptrix: Level 1.3 (#4) 练习
  • 权重生成图像