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

代码随想录Day58|拓扑排序精讲、dijkstra(朴素版)精讲

目录

    • 拓扑排序精讲
      • 解题思路
        • 解法
    • dijkstra(朴素版)精讲
      • 解题思路
        • 解法
    • 今日总结

拓扑排序精讲

题目链接:KamaCoder
文章讲解:代码随想录
视频讲解:bilibili

解题思路

  拓扑排序,只需要找到一个合理的顺序即可,如果存在闭合环路,那么将不存在有效的拓扑排序,因为彼此相互依赖,确定不了先后关系。这里确定当前点没有依赖的方式是判断当前节点是否入度为0,如果入度为零,说明当前点的前序操作都已经完成,可以被执行。而每处理一个节点,就将该节点指向的点的入度更新,指明下一个点的该前序操作完成。这种遍历方式适合用广度优先搜索进行解决。最后结果数组中如果点数与总点数不同,则说明存在环路,不存在有效的拓扑排序。

解法
#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>using namespace std;int main(){int n, m;cin >> n >> m;vector<int> inDegree(n, 0);unordered_map<int, vector<int>> umap;for(int i=0; i<m; i++){int s, t;cin >> s >> t;inDegree[t]++;umap[s].push_back(t);}vector<int> res;queue<int> que;for(int i=0; i<n; i++){if(inDegree[i]==0){que.push(i);}}while(!que.empty()){int cur = que.front();que.pop();res.push_back(cur);if(umap[cur].size()){for(int t : umap[cur]){inDegree[t]--;if(inDegree[t]==0){que.push(t);}}}}if(res.size()==n){for(int i=0; i<n-1; i++){cout << res[i] << " ";}cout << res[n-1] << endl;} else {cout << -1 << endl;}return 0;}
  • 时间复杂度:O(nk)O(nk)O(nk)
  • 空间复杂度:O(nk)O(nk)O(nk)

dijkstra(朴素版)精讲

题目链接:KamaCoder
文章讲解:代码随想录
视频讲解:bilibili

解题思路

  和prim算法很像,都是对于点进行贪心操作,不同的是,prim是得到一个权值之和最小的生成树,而dijkstra则是得到源点到终点的最小距离,而且是有向的,相比于prim的双向节点关系更加严格,这也是为什么dijkstra不能处理权值为负的边,而prim可以。

解法
#include <iostream>
#include <vector>
#include <climits>using namespace std;int main(){int n, m;cin >> n >> m;vector<vector<int>> grid(n+1, vector<int>(n+1, INT_MAX));for(int i=1; i<=m; i++){int s, t, val;cin >> s >> t >> val;grid[s][t] = val;}int start = 1; int end = n;vector<int> minDis(n+1, INT_MAX);vector<bool> visited(n+1, false);minDis[start] = 0;for(int i=1; i<=n; i++){int minVal = INT_MAX;int cur = 1;for(int v=1; v<=n; v++){if(!visited[v] && minDis[v] < minVal){minVal = minDis[v];cur = v;}}visited[cur] = true;for(int v=1; v<=n; v++){if(!visited[v] && grid[cur][v] != INT_MAX && grid[cur][v] + minDis[cur] < minDis[v]){minDis[v] = grid[cur][v] + minDis[cur]; }}}if(minDis[end]==INT_MAX){cout << -1 << endl;} else{cout << minDis[n] << endl;}return 0;
}
  • 时间复杂度:O(n2)O(n^2)O(n2)
  • 空间复杂度:O(n2)O(n^2)O(n2)

今日总结

  补卡中()

http://www.dtcms.com/a/529637.html

相关文章:

  • 基于多焦点高斯邻域注意力机制与大规模基准的视频人群定位
  • 乐清网站制作公司招聘郫县建设局网站
  • 第二次作业-第二章的时间服务
  • 广州网站制作开发公司哪家好游戏开发物语下载
  • 电机试验平台的基本组成
  • 简单风景网站模版旅游网站如何做推广
  • 天津市城市建设学校官方网站教用vs2013做网站的书
  • 最好的域名注册网站jexus wordpress
  • Dataflare:一款简单易用的数据库管理工具
  • When NOMA Meets AIGC: Enhanced WirelessFederated Learning
  • 能源网站建设wordpress开头空两格
  • 网站建设不一定当地最新黑帽seo培训
  • 【ShardingSphere5】实战教程(快速入门掌握核心)
  • 网站上线后做什么ssh做网站步骤
  • 多线程之阻塞队列
  • NOR Flash,25Q系列,25Q80,25Q16,25Q32,对标普冉,兆易,恒硕,华邦等,低功耗SPI NOR,闪存芯片
  • WordPress怎么建小站单页营销网站
  • 笔记【字符串及相关操作】
  • 网站建设 探索扬州建网站
  • 合肥网站制作建设中企动力公司是国企吗
  • 捷信做单网站手工制作帽子 小学生
  • H5页面获取定位一直显示加载中
  • 女生做网站推广wordpress死链删除
  • 数据结构--并查集
  • 简约创意网页设计seo还能赚钱吗
  • 本地用织梦做网站免费的wordpress企业模板
  • 苏州建设工程招标官方网站html网页制作心得体会
  • 公司做卖网站有前景吗域名对网站排名的影响
  • AI编程项目开发手册
  • 数据结构(HS)