• LeetCode:1334. 阈值距离内邻居最少的城市(Floyd C++)


    1334. 阈值距离内邻居最少的城市

    链接:

    1334. 阈值距离内邻居最少的城市

    题目描述:

            有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold

    返回能通过某些路径到达其他城市数目最少、且路径距离 最大 为 distanceThreshold 的城市。如果有多个这样的城市,则返回编号最大的城市。

    注意,连接城市 i 和 j 的路径的距离等于沿该路径的所有边的权重之和。

    示例 1:

    输入:n = 4, edges = [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], distanceThreshold = 4
    输出:3
    解释:城市分布图如上。
    每个城市阈值距离 distanceThreshold = 4 内的邻居城市分别是:
    城市 0 -> [城市 1, 城市 2] 
    城市 1 -> [城市 0, 城市 2, 城市 3] 
    城市 2 -> [城市 0, 城市 1, 城市 3] 
    城市 3 -> [城市 1, 城市 2] 
    城市 0 和 3 在阈值距离 4 以内都有 2 个邻居城市,但是我们必须返回城市 3,因为它的编号最大。
    

    示例 2:

    输入:n = 5, edges = [[0,1,2],[0,4,8],[1,2,3],[1,4,2],[2,3,1],[3,4,1]], distanceThreshold = 2
    输出:0
    解释:城市分布图如上。 
    每个城市阈值距离 distanceThreshold = 2 内的邻居城市分别是:
    城市 0 -> [城市 1] 
    城市 1 -> [城市 0, 城市 4] 
    城市 2 -> [城市 3, 城市 4] 
    城市 3 -> [城市 2, 城市 4]
    城市 4 -> [城市 1, 城市 2, 城市 3] 
    城市 0 在阈值距离 2 以内只有 1 个邻居城市。
    

    提示:

    • 2 <= n <= 100
    • 1 <= edges.length <= n * (n - 1) / 2
    • edges[i].length == 3
    • 0 <= fromi < toi < n
    • 1 <= weighti, distanceThreshold <= 10^4
    • 所有 (fromi, toi) 都是不同的。

    实现代码与解析:

    Floyd

    1. class Solution {
    2. public:
    3. int INF = 1e9;
    4. int findTheCity(int n, vectorint>>& edges, int distanceThreshold) {
    5. // 邻接矩阵
    6. vectorlong long>> d(n, vector<long long>(n));
    7. // 初始化
    8. for (int i = 0; i < n; i++) {
    9. for (int j = 0; j < n; j ++) {
    10. if (i == j) d[i][j] = 0;
    11. else d[i][j] = INF;
    12. }
    13. }
    14. // 读入边
    15. for (int i = 0; i < edges.size(); i ++) {
    16. for (int j = 0; j < edges.size(); j ++) {
    17. int a = edges[i][0];
    18. int b = edges[i][1];
    19. int w = edges[i][2];
    20. d[a][b] = w; d[b][a] = w;
    21. }
    22. }
    23. // floyd 计算最短路,这里每个节点都要求,根据复杂度,所以用此算法
    24. for (int k = 0; k < n; k++) {
    25. for (int i = 0; i < n; i++) {
    26. for (int j = 0; j < n; j++) {
    27. d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
    28. }
    29. }
    30. }
    31. int min = INF; // 最小个数
    32. int res = 0; // 结果编号
    33. for (int i = 0; i < n; i++) {
    34. int cnt = 0;
    35. // cout << "第"+to_string(i)+"节点" << endl;
    36. for (int j = 0; j < n; j++) {
    37. if (i == j) continue;
    38. if (d[i][j] <= distanceThreshold) cnt++;
    39. // cout << d[i][j]<< endl;
    40. }
    41. // cout << endl;
    42. if (cnt <= min) {
    43. min = cnt;
    44. res = i;
    45. }
    46. }
    47. return res;
    48. }
    49. };

    原理思路:

            根据题目描述,和给出的数据量,需要得出每个结点到其他结点的最小值来计算结果,因此使用Floyd算法。

            在Floyd板子中,判断一下每个结点最短距离小于阈值的个数即可。

  • 相关阅读:
    亲测一款超实用的在线制作产品册工具,一看就会
    golang技术降本增效的手段
    Android---字节码层面分析Class类文件
    vue3实现塔罗牌翻牌
    【C语言实现内核链表】
    能掌握未来3个发财趋势的人
    Java、泛型快速排序
    un7.30:Linux——如何在docker容器中显示MySQL的中文字符?
    刚参加工作的表弟问我枚举跟常量的使用场景
    【CSDN 每日一练 ★★☆】【字符串】外观数列
  • 原文地址:https://blog.csdn.net/Cosmoshhhyyy/article/details/134422925