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

算法训练 | 图论Part8 | 117. 软件构建、47. 参加科学大会

目录

117. 软件构建

拓扑排序法

47. 参加科学大会

dijkstra法


117. 软件构建

  • 题目链接:117. 软件构建

  • 文章讲解:代码随想录

拓扑排序法
  • 代码一:拓扑排序

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;
int main() {int m, n, s, t;cin >> n >> m;vector<int> inDegree(n, 0); // 记录每个文件的入度unordered_map<int, vector<int>> umap;// 记录文件依赖关系vector<int> result; // 记录结果while (m--) {// s->t,先有s才能有tcin >> s >> t;inDegree[t]++; // t的入度加一umap[s].push_back(t); // 记录s指向哪些文件}queue<int> que;for (int i = 0; i < n; i++) {// 入度为0的文件,可以作为开头,先加入队列if (inDegree[i] == 0) que.push(i);//cout << inDegree[i] << endl;}// int count = 0;while (que.size()) {int  cur = que.front(); // 当前选中的文件que.pop();//count++;result.push_back(cur);vector<int> files = umap[cur]; //获取该文件指向的文件if (files.size()) { // cur有后续文件for (int i = 0; i < files.size(); i++) {inDegree[files[i]] --; // cur的指向的文件入度-1if(inDegree[files[i]] == 0) que.push(files[i]);}}}if (result.size() == n) {for (int i = 0; i < n - 1; i++) cout << result[i] << " ";cout << result[n - 1];} else cout << -1 << endl;}

47. 参加科学大会

  • 题目链接:47. 参加科学大会(第六期模拟笔试)

  • 文章讲解:代码随想录

dijkstra法
  • 代码一:dijkstra

#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {int n, m, p1, p2, val;cin >> n >> m;vector<vector<int>> grid(n + 1, vector<int>(n + 1, INT_MAX));for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid[p1][p2] = val;}int start = 1;int end = n;// 存储从源点到每个节点的最短距离std::vector<int> minDist(n + 1, INT_MAX);// 记录顶点是否被访问过std::vector<bool> visited(n + 1, false);minDist[start] = 0;  // 起始点到自身的距离为0for (int i = 1; i <= n; i++) { // 遍历所有节点int minVal = INT_MAX;int cur = 1;// 1、选距离源点最近且未访问过的节点for (int v = 1; v <= n; ++v) {if (!visited[v] && minDist[v] < minVal) {minVal = minDist[v];cur = v;}}visited[cur] = true;  // 2、标记该节点已被访问// 3、第三步,更新非访问节点到源点的距离(即更新minDist数组)for (int v = 1; v <= n; v++) {if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) {minDist[v] = minDist[cur] + grid[cur][v];}}}if (minDist[end] == INT_MAX) cout << -1 << endl; // 不能到达终点else cout << minDist[end] << endl; // 到达终点最短路径}

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

相关文章:

  • 编程从零基础到进阶(更新中)
  • MySQL运维实战之ProxySQL(9.6)SQL黑名单
  • 深入了解MySQL中的innodb_lock_wait_timeout
  • 102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程
  • 文章管理小程序的设计
  • Ubuntu22.04安装NIVIDIA显卡驱动总结
  • Redis的配置优化、数据类型、消息队列
  • 数据结构之初始二叉树(2)
  • 如何预防最新的baxia变种勒索病毒感染您的计算机?
  • git列出提交记录的文件路径
  • 微信小程序密码 显示隐藏 真机兼容问题
  • C# 中,使用 LINQ 示例 备忘
  • GaussDB DWS 详解
  • 【256 Days】我的创作纪念日
  • 3D云渲染工具对决:Maya与Blender的性能和功能深度比较
  • spring.factories详解
  • 从Docker Hub 拉取镜像一直失败超时?这些解决方案帮你解决烦恼
  • 【pbootcms】新环境搭建环境安装时发生错误
  • C语言之qsort函数
  • R 数据重塑
  • opencascade AIS_InteractiveContext源码学习8 trihedron display attributes
  • 【云岚到家】-day05-6-项目迁移-门户-CMS
  • linux彻底卸载docker
  • linux高级编程(网络)(www,http,URL)
  • Perl 语言开发(十三):网络编程
  • Leetcode算法题(移除链表中的元素)
  • 浅谈网络安全防守:从被动应对到主动管理的转变
  • CentOS7仅安装部署MySQL80客户端
  • 力扣经典题目之->移除值为val元素的讲解,的实现与讲解
  • pico+unity3d项目配置