笔记:代码随想录算法训练营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
相关推荐
草堂春睡足6 分钟前
【Datawhale AI夏令营】科大讯飞AI大赛(大模型技术)/夏令营:让AI理解列车排期表
人工智能·笔记
Olrookie2 小时前
若依前后端分离版学习笔记(一)——本地部署
笔记·后端·开源
##echo3 小时前
嵌入式Linux裸机开发笔记9(IMX6ULL)GPIO 中断实验(1)
linux·c语言·笔记·单片机·嵌入式硬件
我爱学嵌入式6 小时前
C语言第 9 天学习笔记:数组(二维数组与字符数组)
c语言·笔记·学习
_Kayo_13 小时前
VUE2 学习笔记6 vue数据监测原理
vue.js·笔记·学习
使二颗心免于哀伤15 小时前
《设计模式之禅》笔记摘录 - 10.装饰模式
笔记·设计模式
悠哉悠哉愿意16 小时前
【电赛学习笔记】MaxiCAM 项目实践——与单片机的串口通信
笔记·python·单片机·嵌入式硬件·学习·视觉检测
岩中竹17 小时前
广东省省考备考——常识:科技常识(持续更新)
笔记
Olrookie17 小时前
若依前后端分离版学习笔记(三)——表结构介绍
笔记·后端·mysql
rannn_11118 小时前
Java学习|黑马笔记|Day23】网络编程、反射、动态代理
java·笔记·后端·学习