题目来源:
leetcode题目,网址:1334. 阈值距离内邻居最少的城市 - 力扣(LeetCode)
解题思路:
利用贝尔曼-福德算法计算出每个节点到其余节点的最短距离后对符合条件的计数,返回计数最小且编号最大的城市。
解题代码:
class Solution {
public:int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {vector<vector<int>> matrix=getMatrix(n,edges); //距离向量int res=0; //城市编号int min=10001; //符合要求的其他城市数目for(int i=0;i<matrix.size();i++){int cnt=0;for(int j=0;j<n;j++){if(matrix[i][j]<=distanceThreshold){cnt++;}}cout<<i<<" "<<cnt<<endl;if(cnt<=min){res=i;min=cnt;}}return res;}vector<vector<int>> getMatrix(int n,vector<vector<int>>& edges){vector<vector<int>> res(n); //初始不可达for(int i=0;i<n;i++){res[i]=getDistance(i,n,edges);}return res;}vector<int> getDistance(int i,int n,vector<vector<int>> edges){vector<int> res(n,10001);res[i]=0;bool flag=true;while(flag){flag=false;for(int i=0;i<edges.size();i++){if(res[edges[i][0]]+edges[i][2]<res[edges[i][1]]){res[edges[i][1]]=res[edges[i][0]]+edges[i][2];flag=true;}else if(res[edges[i][1]]+edges[i][2]<res[edges[i][0]]){res[edges[i][0]]=res[edges[i][1]]+edges[i][2];flag=true;}}}return res; }
};
总结:
把贝尔曼-福德算法和普里姆算法搞混了...... 代码可以优化一下,首先 最短距离超过阈值后就可返回,其次 a 节点到 b 节点的距离与 b 节点到 a 节点的距离相等,只需计算一次.
官方题解给出了分别基于 Dijkstra 算法和 Floyd 算法的代码.