笔记:代码随想录算法训练营day64:拓扑排序精讲、dijkstra(朴素版)精讲

学习资料:代码随想录

拓扑排序精讲

卡码网:117. 软件构建

要先处理被依赖的文件。两步曲:找到入度为0的节点,加入结果;删除入度为0的节点(具体操作为将其通向的节点的入度数减一,从而可以判断删除之后的节点了)

整个过程使用广度优先搜索完成,毕竟每一次要记录该节点通向的所有节点,与广度优先搜索非常契合

cpp 复制代码
#include <iostream>
#include <unordered_map>
#include <vector>
#include <queue>
using namespace std;
 
int main(){
    int n,m;
    cin>>n>>m;
    unordered_map<int,vector<int>> umap;
    int s,t;
    vector<int> inDegrees(n,0);
    for(int i=0;i<m;i++){
        cin>>s>>t;
        inDegrees[t]++;
        umap[s].push_back(t);     //记录s指向的文件
    }
 
    queue<int> que;
    for(int i=0;i<n;i++){
        if(inDegrees[i]==0){
            que.push(i);
        }
    }
    vector<int> result;
    while(!que.empty()){
        int cur = que.front();
        que.pop();
        result.push_back(cur);
        vector<int> files = umap[cur];
        if(files.size()){
            for(int i=0;i<files.size();i++){
                inDegrees[files[i]]--;
                if(inDegrees[files[i]]==0){
                    que.push(files[i]);
                }
            }
        }
    }
 
    if(result.size()==n){
        for(int i=0;i<n-1;i++){
            cout<<result[i]<<' ';   //正好被依赖的在result的最前边
        }
        cout<<result[n-1];
    }
    else{           //有环的情况(result.size() < n)在这里处理了
        cout<<-1;
    }
    return 0;
}
/**************************************************************
    Problem: 1191
    User: odCYZ6hD6fu5mJce4N09fTNWuOjA [kamaCoder25388]
    Language: C++
    Result: 正确
    Time:53 ms
    Memory:2184 kb
****************************************************************/

dijkstra(朴素版)精讲

卡码网:47. 参加科学大会

相对于prim算法 minDist表示 节点到最小生成树的最小距离,dijksta算法minDist表示 节点到源点的最小距离

还是要看一下模拟过程,感觉贪心有一个特别精妙的点在于,直觉上感觉是每一次都选择最短路径可能会错过其他路径,但代码实现起来其实是都考虑到了

cpp 复制代码
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
 
int main(){
    int n,m,s,e,v;
    cin>>n>>m;
    vector<vector<int>> traffic(n+1,vector<int>(n+1,INT_MAX));
    for(int i=0;i<m;i++){
        cin>>s>>e>>v;
        traffic[s][e]=v;
    }
 
    vector<int> minDis(n+1,INT_MAX);
    vector<bool> visited(n+1,false);
//初始化
    int start=1;
    int end = n;
    minDis[start]=0;
 
 
    for(int i=0;i<n;i++){        //这里可视为操作n次,每一轮从所有还没访问过的点中,挑一个到起点距离最短的点,然后用它更新它的邻居
        int cur = 1;
        int minVal = INT_MAX;
 
//选距离源最近且未被访问过的节点,后面mindis数组的每一次更新都是基于新加的站,都是该站能确定跑到的站
        for(int j=1;j<=n;j++){
            if(!visited[j]&&minDis[j]<minVal){
                cur=j;
                minVal=minDis[j];
            }
        }
 
        visited[cur]=true;
        //更新各未记录的站点到始发站的距离
        for(int k=1;k<=n;k++){
            if(!visited[k]&&traffic[cur][k]!=INT_MAX&&minDis[cur]+traffic[cur][k]<minDis[k]){
                minDis[k]=minDis[cur]+traffic[cur][k];
            }
        }
    }
    if(minDis[end]==INT_MAX) cout<<-1;
    else cout<<minDis[end]<<endl;
}
/**************************************************************
    Problem: 1047
    User: odCYZ6hD6fu5mJce4N09fTNWuOjA [kamaCoder25388]
    Language: C++
    Result: 正确
    Time:36 ms
    Memory:2176 kb
****************************************************************/
© 2023 卡码网 版权所有 | 粤ICP备2022108040号-1 | pow
相关推荐
一只侯子1 天前
Face AE Tuning
图像处理·笔记·学习·算法·计算机视觉
whale fall1 天前
【剑雅14】笔记
笔记
星空的资源小屋1 天前
跨平台下载神器ArrowDL,一网打尽所有资源
javascript·笔记·django
Xudde.1 天前
Quick2靶机渗透
笔记·学习·安全·web安全·php
AA陈超1 天前
Git常用命令大全及使用指南
笔记·git·学习
愚戏师1 天前
Python3 Socket 网络编程复习笔记
网络·笔记
降临-max1 天前
JavaSE---网络编程
java·开发语言·网络·笔记·学习
大白的编程日记.1 天前
【计算网络学习笔记】MySql的多版本控制MVCC和Read View
网络·笔记·学习·mysql
IMPYLH1 天前
Lua 的 require 函数
java·开发语言·笔记·后端·junit·lua
YJlio1 天前
进程和诊断工具学习笔记(8.29):ListDLLs——一眼看清进程里加载了哪些 DLL,谁在偷偷注入
android·笔记·学习