六月集训(第27天)—图

1. 1514. 概率最大的路径

    思路:
        贪心的每次选择成功率最高的路走,每次记录到达每个点的最大成功率,返回end点的成功率即可。

class Solution {
    // 要求最大的成功概率,即不能走重复的路,否则,每重复一次,乘一个小于1的数,成功率会变小
    #define maxn 20020
    struct EDGE {
        int to;
        double val;

        EDGE() {}
        EDGE(int _to, double _val) : to(_to), val(_val) {}
    };
public:
    vector<EDGE> edge[maxn];

    double bfs(int start, int end) {
        queue<int> Q;
        Q.push(start);
        double ans[maxn];
        for (int i = 0; i < maxn; ++i) ans[i] = 0;
        ans[start] = 1;

        while (!Q.empty()) {
            int now = Q.front();
            Q.pop();
            int now_size = edge[now].size(), i;


            for (i = 0; i < now_size; ++i) {
                int v = edge[now][i].to;
                double w = edge[now][i].val;
                double new_ans = w * ans[now];
                if (new_ans > ans[v]) {
                    Q.push(v);
                    ans[v] = new_ans;
                }
            }
        }
        return ans[end];
    }

    double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) {
        int edges_size = edges.size(), i;
        for (i = 0; i < edges_size; ++i) {
            int u = edges[i][0];
            int v = edges[i][1];
            double w = succProb[i];
            edge[u].push_back(EDGE(v, w));
            edge[v].push_back(EDGE(u, w));
        }
        return bfs(start, end);
        // return ans == 1 ? 0 : ans;
    }
};
posted @ 2022-06-27 09:14  番茄元  阅读(27)  评论(0)    收藏  举报