基础算法集训第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];
    }
};
相关推荐
CC数分1 小时前
统计学基础|先把问题问对:数据分析的六大类型
大数据·人工智能·算法
地平线开发者2 小时前
CLIP 的训练机制:从对比学习到图文对齐
深度学习·算法·自动驾驶
hetao17338372 小时前
2026-11-02 hetao1733837 的刷题记录
c++·算法
Geektec2 小时前
IMU 选型完全指南:从硬件参数到算法融合的系统工程视角
算法·imu·陀螺仪·加速度计·元器件选型
CQU_JIAKE2 小时前
11.2【A】
算法
Tairitsu_H2 小时前
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?
数据结构·c++·图论
Godspeed Zhao3 小时前
从零开始学AI21——决策树
算法·决策树·机器学习
开开心心就好3 小时前
网页图片批量下载工具,输入链接就保存
服务器·算法·leetcode·支持向量机·pdf·ocr·1024程序员节
Tairitsu_H4 小时前
[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?
数据结构·c++·图论·最小生成树
Navigator_Z4 小时前
LeetCode //C - 1313. Decompress Run-Length Encoded List
c语言·算法·leetcode