基础算法集训第20天:Dijkstra

743. 网络延迟时间 - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        vector<vector<int>> gra(n,vector<int> (n,0x3f3f3f3f));
        for(int i=0;i<times.size();i++){
            gra[times[i][0]-1][times[i][1]-1]=times[i][2];
        }
        vector<bool> vis(n,false);
        vector<int> dis(n,0x3f3f3f3f);
        dis[k-1]=0;
        while(true){
            int mindis=0x3f3f3f3f;
            int index=-1;
            for(int i=0;i<n;i++){
                if(!vis[i]&&dis[i]<mindis){
                   index=i;
                mindis=dis[i];
                }
            }
            if(index==-1){
                break;
            }
            vis[index]=true;
            for(int i=0;i<n;i++){
                if(!vis[i]&&gra[index][i]!=0x3f3f3f3f){
                    dis[i]=min(dis[i],gra[index][i]+dis[index]);
                }
            }
        }
        int maxdis=0;
        for(int i=0;i<n;i++){
            if(dis[i]==0x3f3f3f3f){
                return -1;
            }
            maxdis=max(maxdis,dis[i]);
        }
        return maxdis;
    }
};

1334. 阈值距离内邻居最少的城市 - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    int findTheCity(int n, vector<vector<int>>& edges, int distanceThreshold) {
        vector<vector<int>> gra(n,vector<int> (n,0x3f3f3f3f));
        for(int i=0;i<edges.size();i++){
            gra[edges[i][0]][edges[i][1]]=edges[i][2];
            gra[edges[i][1]][edges[i][0]]=edges[i][2];
        }
        for(int i=0;i<n;i++){
            gra[i][i]=0;
        }
        int res=0;
        int cnt=n;
        for(int p=0;p<n;p++){
            vector<bool> vis(n,false);
            vector<int> dis(n,0x3f3f3f3f);
            dis[p]=0;
            while(true){
                int mindis=0x3f3f3f3f;
                int index=-1;
                for(int i=0;i<n;i++){
                    if(!vis[i]&&dis[i]<mindis){
                        mindis=dis[i];
                        index=i;
                    }
                }
                if(index==-1){
                    break;
                }
                vis[index]=true;
                for(int i=0;i<n;i++){
                    if(!vis[i]&&gra[index][i]!=0x3f3f3f3f){
                        dis[i]=min(dis[i],dis[index]+gra[index][i]);
                    }
                }
            }
            int count=-1;
            for(int i=0;i<n;i++){
                if(dis[i]<=distanceThreshold){
                    count++;
                }
            }
            if(count<cnt){
                cnt=count;
                res=p;
            }
            else if(cnt==count){
                res=max(res,p);
            }
        }
        return res;
    }
};

2662. 前往目标的最小代价 - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    int minimumCost(vector<int>& start, vector<int>& target, vector<vector<int>>& specialRoads) {
        vector<vector<int>> point;
        point.push_back(start);
        point.push_back(target);
        for(int i=0;i<specialRoads.size();i++){
            point.push_back({specialRoads[i][0],specialRoads[i][1]});
            point.push_back({specialRoads[i][2],specialRoads[i][3]});
        }
        int n=point.size();
        vector<vector<int>> gra(n,vector<int> (n,0x3f3f3f3f));
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                int dx=abs(point[i][0]-point[j][0]);
                int dy=abs(point[i][1]-point[j][1]);
                gra[i][j]=dx+dy;
            }
        }
        for(int i=0;i<specialRoads.size();i++){
            int from=2+i*2;
            int to=2+i*2+1;
            gra[from][to]=min(gra[from][to],specialRoads[i][4]);
        }
        vector<bool> vis(n,false);
        vector<int> dis(n,0x3f3f3f3f);
        dis[0]=0;
        while(true){
            int mindis=0x3f3f3f3f;
            int index=-1;
            for(int i=0;i<n;i++){
                if(!vis[i]&&dis[i]<mindis){
                    mindis=dis[i];
                    index=i;
                }
            }
            if(index==-1){
                break;
            }
            vis[index]=true;
            for(int i=0;i<n;i++){
                if(!vis[i]){
                    dis[i]=min(dis[i],gra[index][i]+dis[index]);
                }
            }
        }
        return dis[1];
    }
};
相关推荐
qizayaoshuap1 小时前
# ❌ 井字棋 — 鸿蒙ArkTS Minimax AI算法与博弈系统设计
人工智能·算法·华为·harmonyos
皓月斯语2 小时前
B3842 [GESP202306 三级] 春游 题解
数据结构·c++·算法·题解
atunet2 小时前
树状结构在查询优化中的作用与实现细节7
算法
徐凤年_2 小时前
rog_map参数理解
算法
春日见2 小时前
算法与数据结构----哈希表
数据结构·人工智能·算法·机器学习·自动驾驶·哈希算法·散列表
叩码以求索3 小时前
统计按位或能得到最大值的子集数目(一)
数据结构·算法
tachibana23 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
txzrxz3 小时前
单调队列讲解
数据结构·c++·算法·单调队列
不会就选b4 小时前
算法日常・每日刷题--<快排>4
算法
Keven_114 小时前
算法札记:树状数组的用途
数据结构·算法