LeetCode1334. 阈值距离内邻居最少的城市 [Medium]

1334. Find the City With the Smallest Number of Neighbors at a Threshold Distance

There are n cities numbered from 0 to n-1. Given the array edges where edges[i] = [fromi, toi, weighti] represents a bidirectional and weighted edge between cities fromi and toi, and given the integer distanceThreshold.

Return the city with the smallest number of cities that are reachable through some path and whose distance is at most distanceThreshold, If there are multiple such cities, return the city with the greatest number.

Notice that the distance of a path connecting cities i and j is equal to the sum of the edges’ weights along that path.

Example 1:

LeetCode1334. 阈值距离内邻居最少的城市 [Medium]_第1张图片

Input: n = 4, edges = [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], distanceThreshold = 4
Output: 3
Explanation: The figure above describes the graph.
The neighboring cities at a distanceThreshold = 4 for each city are:
City 0 -> [City 1, City 2]
City 1 -> [City 0, City 2, City 3]
City 2 -> [City 0, City 1, City 3]
City 3 -> [City 1, City 2]
Cities 0 and 3 have 2 neighboring cities at a distanceThreshold = 4, but we have to return city 3 since it has the greatest number.

Example 2:

LeetCode1334. 阈值距离内邻居最少的城市 [Medium]_第2张图片

Input: n = 5, edges = [[0,1,2],[0,4,8],[1,2,3],[1,4,2],[2,3,1],[3,4,1]], distanceThreshold = 2
Output: 0
Explanation: The figure above describes the graph.
The neighboring cities at a distanceThreshold = 2 for each city are:
City 0 -> [City 1]
City 1 -> [City 0, City 4]
City 2 -> [City 3, City 4]
City 3 -> [City 2, City 4]
City 4 -> [City 1, City 2, City 3]
The city 0 has 1 neighboring city at a distanceThreshold = 2.

Constraints:

  • 2 <= n <= 100
  • 1 <= edges.length <= n * (n - 1) / 2
  • edges[i].length == 3
  • 0 <= fromi < toi < n
  • 1 <= weighti, distanceThreshold <= 10^4
  • All pairs (fromi, toi) are distinct.

题目:有 n 个城市,按从 0n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromitoi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。返回能通过某些路径到达其他城市数目最少、且路径距离 最大distanceThreshold 的城市。如果有多个这样的城市,则返回编号最大的城市。

思路:计算点与点间的最短距离,采用Floyd算法。注意最外层循环为可能松弛的中间节点k。参考lee215.

工程代码下载

class Solution {
     
public:
    int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {
     
        vector<vector<int>> dist(n, vector<int>(n, 10001));
        for(auto e : edges)
            dist[e[0]][e[1]] = dist[e[1]][e[0]] = e[2];
        for(int i = 0; i < n; ++i)
            dist[i][i] = 0;


        for(int k = 0; k < n; ++k)
            for(int i = 0; i < n; ++i)
                for(int j = 0; j < n; ++j)
                    dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);

        int res = 0, cur = n;
        for(int i = 0; i < n; ++i){
     
            int cnt = 0;
            for(int j = 0; j < n; ++j){
     
                if(i != j && dist[i][j] <= distanceThreshold)
                    cnt += 1;
            }
            if(cnt <= cur){
     
                cur = cnt;
                res = i;
            }
        }

        return res;

    }
};

你可能感兴趣的:(leetcode)