基础算法集训第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];
    }
};
相关推荐
颜酱1 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919102 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878382 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
DuHz2 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
Polaris北极星少女2 小时前
TRSV优化2
算法
代码游侠3 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_763472463 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
abluckyboy4 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异4 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_706653234 小时前
分布式系统安全通信
开发语言·c++·算法