LeetCode 1334. 閾值距離內鄰居最少的城市(跑n次Dijkstra、或者使用Floyd)

n次Dijkstra

class Solution {
public:
    int n;
    void dijkstra(int s,vector<vector<int>> &graph,vector<int> &d){
        vector<bool> vis(n,0);
        d[s] = 0;
        for(int i=0;i<n;i++){
            int y = -1;
            for(int j=0;j<n;j++){
                if(!vis[j] && ( y==-1 || d[j]<d[y]  )){
                    y = j;
                }
            }
            vis[y] = 1;
            for(int x=0;x<n;x++){
                if(d[x]>d[y]+graph[x][y]){
                    d[x] = d[y] + graph[x][y];
                }
            }
        }
    }
    int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {
        this->n = n;
        vector<int> res(n,0);
        int minNum = n,minID=0;
        vector<vector<int>> graph(n+1,vector<int>(n+1,(int)5e8));
        for(auto &edge:edges){
            graph[edge[0]][edge[1]] = edge[2];
            graph[edge[1]][edge[0]] = edge[2];
        }
        for(int i=0;i<n;i++){
            vector<int> d(n,(int)5e8);
            dijkstra(i,graph,d);
            for(int x:d){
                // cout<<x<<"  ";
                if(x<=distanceThreshold){
                    res[i]++;
                }
            }
            res[i]--;
            // cout<<"   --  "<<res[i]<<endl;
            minNum = min(minNum,res[i]);
        }
        for(int i=0;i<n;i++){
            if(res[i]==minNum){
                minID = i;
            }
        }
        return minID;
    }

};

一次FLoyd求任意兩點的距離

class Solution {
public:
    int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {
        int d[110][110];
        memset(d,0x3f,sizeof(d));
        for(int i=0;i<n;i++) d[i][i] = 0; //自己到自己的距離爲0
        for(auto &e:edges){
            d[e[0]][e[1]] = d[e[1]][e[0]] =  e[2];
        }
        for(int k=0;k<n;k++)
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
        int res[110] = {0},minNum = n,minID;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(d[i][j]<=distanceThreshold){
                    res[i]++;
                }
            }
            minNum = min(minNum,res[i]);
        }
        for(int i=0;i<n;i++){
            if(res[i]==minNum){
                minID = i;
            }
        }
        return minID;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章