算法训练 | 图论Part8 | 拓扑排序、dijkstra(朴素版)

目录

117. 软件构建

拓扑排序法

47. 参加科学大会

dijkstra法


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才能有t
        cin >> 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的指向的文件入度-1
                if(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. 参加科学大会

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;  // 起始点到自身的距离为0

    for (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; // 到达终点最短路径

}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 16:02:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 16:02:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 16:02:01       58 阅读
  4. Python语言-面向对象

    2024-07-11 16:02:01       69 阅读

热门阅读

  1. JWT总结

    2024-07-11 16:02:01       20 阅读
  2. React Redux使用@reduxjs/toolkit的hooks

    2024-07-11 16:02:01       21 阅读
  3. 解析Spring Cloud中的配置中心实现

    2024-07-11 16:02:01       23 阅读
  4. 05.FFMPEG日志系统

    2024-07-11 16:02:01       21 阅读
  5. react遍历数据翻页

    2024-07-11 16:02:01       23 阅读
  6. Perl 语言入门:编写并执行你的第一个脚本

    2024-07-11 16:02:01       23 阅读
  7. 具名/匿名/作用域插槽区分

    2024-07-11 16:02:01       24 阅读
  8. mysql select count返回null

    2024-07-11 16:02:01       18 阅读
  9. HTML 标签列表(功能排序)

    2024-07-11 16:02:01       20 阅读
  10. Hadoop HA ( 3.1.3 )

    2024-07-11 16:02:01       19 阅读
  11. 【智能制造-14】机器视觉软件

    2024-07-11 16:02:01       23 阅读