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 -1
int 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算法解决。