Re: [闲聊] 每日leetcode

楼主: enmeitiryous (enmeitiryous)   2024-07-26 15:06:24
题目:给你一个数字n代表有0-n-1座城市,以及二维array edges,edges[i]有三个
数字[a,b,c]代表从a城市到b城市距离为c,这样的道路是双向的,最后有一个数字
threshold代表题目希望的基准线,回传能够在threshold距离下能拜访最少城市的城市
编号,如果有复数个城市能拜访最少城市则回传编号大的(例如0,1,2,3四个城市分别
在标准下能拜访2,3,3,2座其他城市则应该要回传3号城市)
思路:
all pair shortest path problem,可以使用floyd warshall或是对每一个点做
dijkstra(因为没有负权重边),得出全部的shortest path后依照threshold纪录可拜
访的城市数,最后依照要求回传编号,从结果看对全部点做dijkstra可能比较快?
floyd warshall复杂度为O(n^3) n是node数
int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {
//unordered_map<vector<int>,int> weight_list;
vector<vector<int>> gr_ap(n,vector<int> (n,10001));
int ww=edges.size();
for(int i=0;i<ww;++i){
gr_ap[edges[i][0]][edges[i][1]]=edges[i][2];
gr_ap[edges[i][1]][edges[i][0]]=edges[i][2];
}
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
for(int y=0;y<n;y++){
if(gr_ap[j][y]>gr_ap[j][i]+gr_ap[i][y] && gr_ap[j][i]!=10001
&&gr_ap[i][y]!=10001){
gr_ap[j][y]=gr_ap[j][i]+gr_ap[i][y];
}
}
}
}
vector<int> pre_ans(n,0);
for(int i=0;i<n;++i){
for(int l=0;l<n;++l){
if(gr_ap[i][l]<=distanceThreshold && i!=l){
pre_ans[i]++;
}
}
}
vector<int> ans={0,pre_ans[0]};
for(int i=0;i<n;++i){
if(pre_ans[i]<=ans[1] && i>=ans[0]){
ans={i,pre_ans[i]};
}
}
return ans[0];
}
作者: oin1104 (是oin的说)   2024-07-26 15:12:00
大师 我的dijk超烂
楼主: enmeitiryous (enmeitiryous)   2024-07-26 15:18:00
我是写到放弃 你有写出来比较强
作者: dont   2024-07-26 15:30:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com