基础算法集训第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];
    }
};
相关推荐
Zane199412 分钟前
暴力字符串匹配失配就要把文本指针往回拉,KMP凭什么能让它一直往前走
算法
Tim_1044 分钟前
【LeetCode】338、比特位计数
c++·算法·leetcode
木子算法1 小时前
不是重心也不是中点:费马—韦伯点、它的最优性条件与迭代求解
人工智能·算法·目标跟踪
tryxr2 小时前
矩阵的几种基础变换
java·数据结构·算法·矩阵
mmmmath_32 小时前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
Selvaggia2 小时前
DMD(Distribution Matching Distillation,分布匹配蒸馏)
算法
Navigator_Z3 小时前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode
All for pursuit.3 小时前
【栈-4】739.每日温度
数据结构·c++·算法·leetcode
All for pursuit.3 小时前
【栈-5】84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
wzdark3 小时前
数据压缩算法的时间复杂度与压缩率权衡4
算法