基础算法集训第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];
    }
};
相关推荐
Yiyaoshujuku2 小时前
疾病的发病率、发病人数、患病率、患病人数、死亡率、死亡人数查询网站及数据库
数据库·人工智能·算法
wen__xvn2 小时前
基础算法集训第18天:深度优先搜索
算法·深度优先·图论
jiang_changsheng2 小时前
comfyui节点插件笔记总结新增加
人工智能·算法·计算机视觉·comfyui
TracyCoder1232 小时前
LeetCode Hot100(7/100)—— 3. 无重复字符的最长子串
算法·leetcode
重生之我是Java开发战士2 小时前
【优选算法】双指针法:移动0,复写0,快乐数,盛水最多的容器,有效三角形个数,二三四数之和
算法
客卿1233 小时前
力扣二叉树简单题整理--(包含常用语法的讲解)
算法·leetcode·职场和发展
hrrrrb3 小时前
【算法设计与分析】递归与分治策略
算法
We་ct3 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标:两种实现与深度解析
前端·算法·leetcode·typescript
血小板要健康3 小时前
118. 杨辉三角,力扣
算法·leetcode·职场和发展