Dijkstra(力扣743)和bellman-Ford(力扣1514)

路由算法

1.dijkstra

普通实现时间复杂度 O ( N 2 ) O(N^{2}) O(N2),堆实现时间复杂度 O ( N l o g N ) O(NlogN) O(NlogN)

class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        int book[n+1];
        int map[n+1][n+1];
        int dis[n+1];
        memset(book, 0, sizeof(book));//0代表当前没有加入路径
        //memset(map, -1, sizeof(map));//-1代表不可达
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                map[i][j] = 999999;
            }
        }
        for(int i = 0; i < times.size(); i++){
            map[times[i][0]][times[i][1]]=times[i][2];
        }
        map[k][k] = 0;
        for(int i = 1; i <= n; i++){
            dis[i] = map[k][i];
        }
        book[k] = 1;
        for(int i = 0; i < n-1; i++){
            int mindis = 999999;
            int cur = 0;
            for(int j = 1; j <= n; j++){
                if(!book[j] && dis[j] != -1 && dis[j] < mindis){
                    mindis = dis[j];
                    cur = j;
                }
            }
            if(cur == 0){
                return -1;
            }
            book[cur] = 1;
            
            for(int q = 1; q <= n; q++){
                if(!book[q] && (dis[cur] + map[cur][q]) < dis[q]){
                    dis[q] = dis[cur] + map[cur][q];
                }
            }
        }
        int maxdis = INT_MIN;
        for(int i = 1; i <= n; i++){
            //cout << dis[i] <<endl;
            maxdis = max(maxdis, dis[i]);
        }
        return maxdis == 999999? -1:maxdis;
    }
};

2.bellman-ford

普通实现时间复杂度 O ( ∣ V ∣ ∣ E ∣ ) O(|V||E|) O(VE),V是节点个数,E是边数

class Solution {
public:
    double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) {
        double dis[n];
        //不能创建一个map,太大了超界
        for(int i = 0; i < n; i++){
            dis[i] = 0;
        }
        dis[start] = 1;
        for(int i = 0; i < n-1; i++){
            bool flag = false;
            for(int j = 0; j < edges.size(); j++){
                int u = edges[j][0];
                int v = edges[j][1];
                if(dis[v] < dis[u] * succProb[j]){
                    dis[v] = dis[u] * succProb[j];
                    flag = true;
                }
                if(dis[u] < dis[v] * succProb[j]){
                    dis[u] = dis[v] * succProb[j];
                    flag = true;
                }
            }
            if(!flag){
                break;
            }
        }
        
        return dis[end];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dijkstra算法Bellman-Ford算法都是用于解决图中单源最短路径问题的经典算法Dijkstra算法是一种贪心算法,用于求解从给定源节点到其他所有节点的最短路径。算法通过维护一个优先队列(或最小堆)来选择当前距离源节点最近的节点,并逐步扩展路径长度最短的节点。具体步骤包括:初始化源节点的距离为0,将其加入优先队列;从队列中取出距离最小的节点,并对其相邻节点进行松弛操作,更新其距离;重复上述步骤直到队列为空。 Bellman-Ford算法是一种动态规划算法,可以处理带有负权边的图。算法通过对所有边进行V-1轮松弛操作来逐步求解最短路径。具体步骤包括:初始化源节点距离为0,其他节点距离为正无穷;迭代V-1轮,对所有边进行松弛操作,即尝试通过更新边权值来缩短源节点到其他节点的距离;检测是否存在负权回路,如果存在则说明图中存在无限负权路径。 两者的主要区别在于: - Dijkstra算法要求图中边权值非负,而Bellman-Ford算法可以处理带负权边的情况。 - Dijkstra算法的时间复杂度为O((V + E)logV),其中V为节点数量,E为边数量;而Bellman-Ford算法的时间复杂度为O(VE),在稀疏图中效率较低。 选择使用哪种算法取决于具体的问题场景和图的特性。如果图中不存在负权边,且需要求解单源最短路径,Dijkstra算法是一个较好的选择。而如果图中可能存在负权边,并且需要检测负权回路,或者只需求解单源最短路径且图较稠密,可以考虑使用Bellman-Ford算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值