day58 第十一章:图论part08

拓扑排序精讲

关键:

先找到入度为0的节点,把这些节点加入队列/结果,然后依次循环再找。

cpp 复制代码
#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;


}

dijkstra(朴素版)精讲

不能处理负权重,贪心算法,minDist表示距离原点最近的距离。

跟prim一样

cpp 复制代码
#include <iostream>
#include <vector>
#include <climits>
using namespace std;

int main(){
    int n,m,s,e,v;
    cin>>n>>m;
    
    vector<vector<int>> grid(n+1,vector<int>(n+1, INT_MAX));
    for(int i=0;i<m;i++){
        cin>>s>>e>>v;
        grid[s][e]=v;
    }
    
    vector<bool> visited(n+1, false);
    vector<int> minDist(n+1, INT_MAX);
    
    int start = 1;
    minDist[start] = 0;
    for(int i=0;i<n;i++){
        
        int cur = -1;
        int minVal = INT_MAX;
        
        //1.选择未到过的且距离起始点最近车站
        for(int j=1;j<=n;j++){
            if(!visited[j] && minDist[j]<minVal){
                cur = j;
                minVal = minDist[j];
            }
        }
        
        if(cur == -1) {
            break;
        }
        
        //2.到达该车站
        visited[cur] = true;
        
        //3.更新minDist
        for(int j=1;j<=n;j++){
            if(!visited[j] && grid[cur][j]!=INT_MAX && minDist[cur]+grid[cur][j]<minDist[j]){
                minDist[j] = minDist[cur]+grid[cur][j];
            }
        }
        // cout<<"cur="<<cur<<endl;
        // for(int k=1;k<=n;k++){
        //     cout<<minDist[k]<<" ";
        // }
        // cout<<endl;
    }
    
    int count = 0;
    for(int i=1;i<=n;i++){
        if(visited[i]){
            count++;
        }
    }
    
    if(count==n){
        cout<<minDist[n]<<endl;
    }
    else{
        cout<<-1<<endl;
    }
    
    
}
相关推荐
祖力558 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省9 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_79810 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25811 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记11 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI11 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型12 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光12 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院13 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡14 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构