《六月集训》(第二十七天)——图

前言

        欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
        今天是六月集训第二十七天:🔥🔥🔥🔥🔥
在这里插入图片描述

一、练习题目

        1514. 概率最大的路径
        LCP 56. 信物传送
        1377. T 秒后青蛙的位置

二、算法思路

  • 1、1514. 概率最大的路径:🔥🔥🔥🔥无向图的最长路径问题,边是权重。
  • 2、LCP 56. 信物传送:🔥🔥🔥🔥🔥
  • 3、1377. T 秒后青蛙的位置:🔥🔥🔥🔥🔥

三、源码剖析

// 1514. 概率最大的路径
class Solution {
    #define maxn 10010
    struct Edge
    {
        int to;
        double val;

        Edge() {}
        Edge(int t, double v) : to(t), val(v) {}
    };

    vector<Edge> edge[maxn];

    double bfs(int start, int end) {
        double dis[maxn] = {0.0}; //(3)
        dis[start] = 1; 
        queue<int> q;
        q.push(start); //(4)
        while (!q.empty())
        {
            int u = q.front();
            q.pop();
            for(int i = 0; i < edge[u].size(); ++i) {
                int v = edge[u][i].to;
                double d = dis[u] * edge[u][i].val;
                if(dis[v] < d) {
                    dis[v] = d;
                    q.push(v);
                } 
            }
        } //(5)
        return dis[end];
        
    }
    
public:
    double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) {
        for(int i = 0; i < edges.size(); ++i) {
            if(succProb[i] <= 0) {
                continue;
            }
            int u = edges[i][0];
            int v = edges[i][1];
            double w = succProb[i];
            
            edge[u].emplace_back(Edge(v, w));
            edge[v].emplace_back(Edge(u, w)); //(1)
        }
        return bfs(start, end); //(2)
    }
};
  • 1、事先根据题目建立双向边;
  • 2、然后从start到end进行SPFA;
  • 3、用一个dist数组来记录纪律,由于是要找最长路,那dist先初始化为0;
  • 4、从start开始,由于是乘法的dist[start]先置为1, 利用一个队列来保存,把start先入队;
  • 5、当队列不为空的时候,取出头元素,作为起点,遍历他的所有边,并计算距离,如果距离比原来的大,更新目标点距离,并让目标入队,最后返回end的dist即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值