2023-11-14每日一题
一、题目编号
1334. 阈值距离内邻居最少的城市
二、题目链接
点击跳转到题目位置
三、题目描述
有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。
返回能通过某些路径到达其他城市数目最少、且路径距离 最大 为 distanceThreshold 的城市。如果有多个这样的城市,则返回编号最大的城市。
注意,连接城市 i 和 j 的路径的距离等于沿该路径的所有边的权重之和。
示例 1:
示例 2:
提示:
- 2 <= n <= 100
- 1 <= edges.length <= n * (n - 1) / 2
- edges[i].length == 3
- 0 <= fromi < toi < n
- 1 <= weighti, distanceThreshold <= 104
- 所有 (fromi, toi) 都是不同的。
四、解题代码
class Solution {#define maxn 101#define inf -1int Min(int a,int b){if(a==inf){return b;}if(b==inf){return a;}return a<b ? a:b;}int mat[maxn][maxn];int spfa(int n,int u,int dt){queue<int> q;int dist[maxn];memset(dist,inf,sizeof(dist));dist[u]=0;q.push(u);while(!q.empty()){u=q.front();q.pop();if(dist[u]>dt){continue;}for(int i=0;i<n;i++){if(mat[u][i] == inf){continue;}int todist=dist[u]+mat[u][i];if(dist[i]==inf || todist< dist[i]){dist[i]=todist;q.push(i);}}}int cnt=0;for(int i=0;i<n;i++){if(dist[i]!=inf && dist[i]<=dt){cnt++;}}return cnt;}public:int findTheCity(int n, vector<vector<int>>& edges, int dt) {memset(mat,inf,sizeof(mat));for(int i=0;i<edges.size();i++){int u=edges[i][0];int v=edges[i][1];int w=edges[i][2];mat[u][v]=mat[v][u]=Min(mat[u][v],w);}int Recnt=111;int index=-1;for(int i=n-1;i>=0;i--){int cnt=spfa(n,i,dt);if(cnt<Recnt){index=i;Recnt=cnt;}}return index;}
};
五、解题思路
(1) 最短路径问题,使用spfa算法解决。