前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是六月集训第二十七天:图🔥🔥🔥🔥🔥
一、练习题目
二、算法思路
- 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即可。