代码随想录第六十六天打卡

server/2024/9/25 11:34:58/

今天大家会感受到 Bellman_ford 算法系列在不同场景下的应用。

建议依然是:一刷的时候,能理解 原理,知道Bellman_ford 解决不同场景的问题 ,照着代码随想录能抄下来代码就好,就算达标。

二刷的时候自己尝试独立去写,三刷的时候 才能有一定深度理解各个最短路算法

Bellman_ford 队列优化算法(又名SPFA)

代码随想录

#include <iostream>
#include <list>
#include <queue>
#include <vector>
#include <climits>
using namespace std;
struct Edge {int to;int val;Edge(int to,int val):to(to),val(val){}
};
void solve() {int n, m, v1, v2, val;cin >> n >> m;vector<list<Edge>>grid(n + 1);for (int i = 0; i < m; i++) {cin >> v1 >> v2 >> val;grid[v1].push_back({ v2,val });}int start = 1;int end = n;vector<int>minDist(n + 1, INT_MAX);vector<bool>isInQueue(n + 1);queue<int>que;minDist[start] = 0;que.push(start);while (!que.empty()) {int node = que.front();que.pop();isInQueue[node] = false;for (Edge edge : grid[node]) {int to = edge.to;int from = node;int value = edge.val;if (minDist[to] > minDist[from] + value) {minDist[to] = minDist[from] + value;if (isInQueue[to]==false) {que.push(to);isInQueue[to] =true;}}}}if (minDist[end] == INT_MAX)cout << "unconnected" << endl;else cout << minDist[end] << endl;
}int main() {solve();return 0;
}

bellman_ford之判断负权回路

代码随想录

#include <iostream>
#include <vector>
#include <list>
#include <climits>
#include <queue>
using namespace std;void solve() {int n, m, v1, v2, val;cin >> n >> m;vector<vector<int>>grid;for (int i = 0; i < m; i++) {cin >> v1 >> v2 >> val;grid.push_back({v1, v2,val });}int start = 1;int end = n;bool flag = false;vector<int>minDist(n + 1,INT_MAX);minDist[start] = 0;for (int i = 1; i <= n; i++) {for (vector<int>& side : grid) {int from = side[0];int to = side[1];int price = side[2];if (i < n) {if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + side[2])minDist[to] = minDist[from] + side[2];}else {if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + side[2])flag = true;}}}if (flag)cout << "circle" << endl;else if (minDist[end] == INT_MAX) {cout << "unconnected" << endl;}else {cout << minDist[end] << endl;}
}int main() {solve();return 0;
}

使用队列

#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <climits>
using namespace std;struct Edge {int to, val;Edge(int to,int val):to(to),val(val){}
};
void solve() {int n, m, v1, v2, val;cin >> n >> m;vector<list<Edge>>grid(n + 1);for (int i = 0; i < m; i++) {cin >> v1 >> v2 >> val;grid[v1].push_back(Edge(v2, val));}int start = 1;int end = n;vector<int>minDist(n + 1,INT_MAX);minDist[start] = 0;queue<int>que;que.push(start);vector<int>count(n + 1, 0);count[start]++;bool flag = false;while (!que.empty()){int node = que.front();que.pop();for (Edge edge : grid[node]) {int from = node;int to = edge.to;int value = edge.val;if (minDist[to] > minDist[from] + value) {minDist[to] = minDist[from] + value;que.push(to);count[to]++;if (count[to] == n) {flag = true;while (!que.empty())que.pop();break;}}}}if (flag)cout << "circle" << endl;else if (minDist[end] == INT_MAX) {cout << "unconnected" << endl;}else {cout << minDist[end] <<endl;}
}
int main() {solve();return 0;
}

bellman_ford之单源有限最短路

代码随想录

#include <iostream>
#include <queue>
#include <list>
#include <vector>
#include <climits>
using namespace std;void solve() {int start,end,k,n, m, v1, v2, val;cin >> n >> m;vector<vector<int>>grid;for (int i = 0; i < m; i++) {cin >> v1 >> v2 >> val;grid.push_back({ v1,v2,val });}cin >> start >> end >> k;vector<int>minDist(n + 1, INT_MAX);minDist[start] = 0;vector<int>minDist_copy(n + 1);for (int i = 1; i <= k + 1; i++) {minDist_copy = minDist;for (vector<int>& side : grid) {int from = side[0];int to = side[1];int price = side[2];if (minDist_copy[from] != INT_MAX && minDist[to] > minDist_copy[from] + price) {minDist[to] = minDist_copy[from] + price;}}}if (minDist[end] == INT_MAX)cout << "unreachable" << endl;else cout << minDist[end] << endl;
}
int main() {solve();return 0;
}

总结

这个题看的有点不是太懂,二刷继续。


http://www.ppmy.cn/server/98542.html

相关文章

三大机器学习框架对比:TensorFlow、PyTorch与Scikit-Learn

目录 前言 概述 TensorFlow PyTorch Scikit-Learn 总结 前言 本篇旨在深入探讨三种主流机器学习框架——TensorFlow、PyTorch与Scikit-Learn。随着数据科学和人工智能领域的快速发展&#xff0c;这些框架已成为构建和部署机器学习模型的关键工具。鉴于每种框架的特点和优…

【Hot100】LeetCode—295. 数据流的中位数

目录 1- 思路① 添加元素实现② 计算实现 2- 实现⭐295. 数据流的中位数——题解思路 原题链接&#xff1a;295. 数据流的中位数 1- 思路 利用优先级队列实现一个大顶堆和一个小顶堆大顶堆用来存放较小的元素&#xff0c;小顶堆用来存放较大的元素 ① 添加元素实现 如果当前…

odoo17 翻译一个小bug

odoo17 翻译一个小bug 用户界面的没译过来 标红处&#xff0c;但在zh_CN.po中明显已经翻译过来了&#xff0c;采取暴力点的&#xff0c;直接把base下的base.pot删除&#xff0c;再更新一下&#xff0c;可以正常显示了

计算机网络中拥塞控制的门限值怎么设置

拥塞避免的门限值设置主要涉及到加权随机早期检测&#xff08;‌WRED&#xff09;‌技术&#xff0c;‌这是一种拥塞避免机制&#xff0c;‌通过为每个队列设定一对低门限和高门限值来实现。‌具体来说&#xff0c;‌当队列长度小于低门限时&#xff0c;‌不丢弃报文&#xff0…

【LabVIEW学习篇 - 12】:通知器

文章目录 通知器案例一案例二案例三&#xff08;在不同VI中用同一个通知器&#xff09; 通知器 同步技术&#xff1a;同步技术用来解决多个并行任务之间的同步或通信问题。 通知器比较适合一对多的操作&#xff0c;类似于广播&#xff0c;一点发出的通知消息&#xff0c; 其它…

【leetcode】杨辉三角 、移除元素(Java语言描述)

杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] …

顺序表各种接口的实现(C)

线性表 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。在物理结构上并不一定是连续的&#xff0c;线性表在物…

【自动驾驶】ROS中自定义格式的服务通信,含命令行动态传参(c++)

目录 通信流程创建服务器端及客户端新建服务通讯文件修改service的xml及cmakelistCMakeLists.txt编辑 msg 相关配置编译消息相关头文件在cmakelist中包含头文件的路径在service包下编写service.cpp在client包下编写client.cpp测试运行查询服务的相关指令列出目前的所有服务&…