文章目录

  • 相关题
  • 743. 网络延迟时间
  • 684. 冗余连接

相关题

LeetCode中有向图相关的题的题号为:743,685,684,399,332,310,210

743. 网络延迟时间

有 N 个网络节点,标记为 1 到 N。

给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。

现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。

解题思路:本题本质上在考察最短路径算法,最短路径算法有单源最短路,多源最短路,然后还掺杂着有权,无权,有向,无向。单源最短路有Dijkstra算法,贝尔福特慢算法(Bellman-Ford Algorithm),Dijkstra算法是模仿图的广度优先遍历(BFS)写的,类似水滴荡起的纹波、迷宫找路等场景。Dijkstra算法首先维护一个dist数组参与松弛操作(Relaxation),当dist[u]>dist[v]+e[u,v],更新路径值dist[u]=dist[v]+e[u,v],防止重复搜索,用visited数组标记已访问过的节点。此题解法我和Grandyang的解法大致相同,但是我的visited数组作为全局变量时,有一半的test case无法通过,不太理解为什么visited作为局部变量就能AC,我在 考虑这个问题的时候思考的方向是,想象水滴荡起纹波的场景,visited作为局部变量,最直接的表象是防止同一层的节点再次被访问,但是将visited作为全局变量,也能达到这个效果,而且也没有干扰dist[u]的更新(之前干过,将visited数组先于dist[u]关系的判断,导致有些节点当放置靠后的位置访问时,能使dist[u]更小),想到这,思路就短路了,接不上了,日后看到此题再思考╮(╯▽╰)╭

在不完全理解此题解法时,也当记住最短路在应用Dijkstra算法时,将visited数组放在层内判断的一种写法。

class Solution {public:int networkDelayTime(vector<vector<int>>& times, int N, int K) {unordered_map<int, vector<pair<int, int>>> g;for (auto t : times) {g[t[0]].push_back({t[1], t[2]});}vector<int> dist(N + 1, INT_MAX);queue<int> q{{K}};dist[K] = 0;while (!q.empty()) {unordered_set<int> visited;for (int i = q.size(); i > 0; --i) {int node = q.front(); q.pop();for (auto t : g[node]) {if (dist[t.first] > dist[node] + t.second) {dist[t.first] = dist[node] + t.second;if (!visited.count(t.first)) {visited.insert(t.first);q.push(t.first);}}}}}int res = 0;for (int i = 1; i <= N; ++i) {res = max(res, dist[i]);}return res == INT_MAX ? -1 : res;}
};

Bellman-Ford算法近似于暴力解法,暴力美学,针对所有的点,对存在的边都进行遍历一次,对已经连接到K点的u节点进行松弛操作。

class Solution {public:int networkDelayTime(vector<vector<int>>& times, int N, int K) {int res = 0;vector<int> dist(N + 1, INT_MAX);dist[K] = 0;for (int i = 1; i < N; ++i) {for (auto time : times) {int u = time[0], v = time[1], w = time[2];if (dist[u] != INT_MAX && dist[v] > dist[u] + w) {dist[v] = dist[u] + w;}}}for (int i = 1; i <= N; ++i) {res = max(res, dist[i]);}return res == INT_MAX ? -1 : res;}
};

上面内容时间:2020-05-13 18:53:48

更新时间:2020-8-2 16:38:26
时隔3个月再做此题。

下面采取的是dijkstra算法的标准写法,模板解题,相关的模板可以见这篇博客,关于图的最短路,对于无权图可以用变型的BFS解,层数对应的即是最短路长度(可以把无权图等同成权值为1的有权图来看),但是对于有权图,用BFS水滴纹波来解就不太合适,因为每层向外延展的路径不等价(水纹荡漾开来的径向距离不等价),对于有权图只能采取dijkstra算法(单源最短路),Floyed算法(多源最短路)

class Solution {public:int networkDelayTime(vector<vector<int>>& times, int N, int K) {vector<int> dist(N + 1, INT_MAX);vector<vector<pair<int, int>>> e(N + 1);for (auto &t : times) {e[t[0]].push_back(make_pair(t[1], t[2]));}vector<bool> visited(N + 1, false);dist[K] = 0;while (1) {int mindis = INT_MAX, minidx = -1;for (int i = 1; i <= N; ++i) {if (visited[i] == false) {if (mindis > dist[i]) {mindis = dist[i];minidx = i;}}}if (minidx == -1) break;visited[minidx] = true;for (int i = 0; i < e[minidx].size(); ++i) {int u = e[minidx][i].first, dis = e[minidx][i].second;if (visited[u] ==  false) {if (dist[u] > dist[minidx] + dis) {dist[u] = dist[minidx] + dis;}}}}int res = 0;for (int i = 1; i <= N; ++i) {if (dist[i] == INT_MAX) return -1;res = max(res, dist[i]);}return res;}
};

684. 冗余连接

原题链接

解题思路: 本题本质上是判断图中是否成环,不过用并查集解题能恰好回避此问题,如果能想到用并查集解此题,估计解题思路基本就出来了,具体的是,在访问边数组的同时构建并查集,若发现某个边对应的两个节点查询到的parent相同,则说明通过之前访问的边已经构建出这两个节点间的通路,而此次访问的是两节点间的直接通路,说明成环。此题的难点是如何通过图的

[LeetCode] LeetCode中与有向图相关的题目总结相关推荐

  1. Leetcode中二叉树中的搜索相关题目解析以及java实现

    Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...

  2. LeetCode 176. Second Highest Salary--Database--数据库题目

    LeetCode 176. Second Highest Salary–Database–数据库题目 LeetCode题解专栏:LeetCode题解 我做的所有的LeetCode的题目都放在这个专栏里 ...

  3. LeetCode 175. Combine Two Tables--Database--数据库题目

    LeetCode 175. Combine Two Tables–Database–数据库题目 LeetCode题解专栏:LeetCode题解 我做的所有的LeetCode的题目都放在这个专栏里,大部 ...

  4. c语言数论应用有关题目,中学数学中及初等数论相关的几个问题.docx

    . 目录 1.前言1 2.利用整除性判别法解决整除问题1 2.1 能被 2k 或 5k 整除的判别法1 2.2 割尾判别法2 3.利用整除的基本性质解题4 4. 最大公因数6 5. 抽屉原理在数论中的 ...

  5. 中学计算机论文题目,中学计算机相关论文题目 中学计算机论文标题如何定

    汇总了[100道]与中学计算机相关论文选题,为广大毕业生和职称者推荐中学计算机相关论文题目,解决在校大学生不知道中学计算机论文标题如何定等相关问题! 一.比较好写的中学计算机论文题目: 1.中学计算机 ...

  6. 计算机与与银行会计论文题目,关于会计方面银行会计学论文,关于对会计的重新认知和思量相关毕业论文题目范文...

    本论文是一篇关于会计方面银行会计学论文,关于对会计的重新认知和思量相关毕业论文题目范文.免费优秀的关于会计及内部控制及社会实践方面论文范文资料,适合会计论文写作的大学硕士及本科毕业论文开题报告范文和学 ...

  7. 中职计算机教育 论文题目,比较好写的中职计算机教育论文题目 中职计算机教育专业论文题目怎样拟...

    [100道]比较好写的中职计算机教育论文题目供您参考,希望能解决毕业生们的中职计算机教育专业论文题目怎样拟相关问题,选好题目那就开始写中职计算机教育论文吧! 一.比较好写的中职计算机教育论文题目: 1 ...

  8. 怎样计算机科学导论答案,计算机科学导论相关论文题目 计算机科学导论专业论文题目怎样拟...

    [100道]计算机科学导论相关论文题目,每一个论文题目都是精选出来的,看了后定能知晓计算机科学导论专业论文题目怎样拟等相关写作技巧,让计算机科学导论论文写作轻松起来! 一.比较好写的计算机科学导论论文 ...

  9. 计算机网络安全技术论文范文,计算机方面论文范文数据库,与关于计算机网络安全防护技术的相关毕业论文题目范文...

    计算机方面论文范文数据库,与关于计算机网络安全防护技术的相关毕业论文题目范文 关于计算机及计算机网络及计算机网络安全方面的免费优秀学术论文范文,计算机方面论文格式范文,关于关于计算机网络安全防护技术的 ...

最新文章

  1. 一句话的设计模式(转)
  2. Controller类的方法上的RequestMapping一定要写在Controller类里吗?
  3. python爬虫股票分析准不准_教你用Python爬虫股票评论,简单分析股民用户情绪
  4. iOS开发--面试总结(二)
  5. Paper:《Graph Neural Networks: A Review of Methods and Applications》翻译与解读
  6. 初步学习Prometheus的微服务监控功能
  7. 电脑知识:如何保养自己的电脑,看完你就懂了!
  8. 谈谈 Java 的克隆
  9. php多文件上传存储到表,PHP 实现一种多文件上传的方法
  10. Fresco 二三事:图片处理之旋转、缩放、裁剪切割图片
  11. python升级到最新版本windows64位安装哪个包_手把手windows64位配置安装python2.7
  12. C语言,两个超大整型数乘法
  13. jQuery——入门(三)JQuery DOM操作(核心处理和文档处理)
  14. 中兴bsc服务器是什么,中兴BSC内部信令流程介绍
  15. ​老男孩教育每日一题-第73天 -基础命令点:可恶的^C
  16. 嵌入式程序员是难得的全栈型程序员
  17. 由QCustomplot引发drawPolyline和drawLine的区别
  18. [论文阅读] (13)英文论文模型设计(Model Design)如何撰写及精句摘抄——以入侵检测系统(IDS)为例
  19. 信息资源管理概论--练习题
  20. 推算几天后的日期 —— 代码篇

热门文章

  1. 独立游戏开发者需要知道的事实【转】
  2. javaSE_《图书馆管理系统》_
  3. 服务器如何禁止访问指定网址,问: 怎么禁止别人的域名访问自己的服务器
  4. 深度学习_图像分割_PANet论文详解
  5. 模块十:mask模块
  6. mysql 参数sql_safe_updates限制update/delete
  7. asfdjendivnfjibn
  8. 16个自动化测试面试问题与解答
  9. android实现 仿iphoneDialog实现类似于iphone对话框样式
  10. 交互设计的心得体会总结