1. 偷袭の题解

思路

其实就是 bfs, 原题需要分层图和 dp 但是由于数据被弱化了(感谢信友队) 我们可以直接使用 bfs 而不是 dijkstra, 因为我们无向图中没有边权,我们直接跑一遍 bfs 即可。

注意,我们这里的 bfs 并不是寻找无向图中边最少的路径,我们要优先考虑生存几率(可能会绕一大圈)

int v = edge[i].to;
double p = edge[i].w * now.p;

if (p < 0.75)
    continue;
    
if (dis[v] == -1)
{
    dis[v] = now.d + 1;
    Pmax[v] = p;
    qu.push({v, dis[v], Pmax[v]});
}
else if(p > Pmax[v])
{
    Pmax[v] = p;
    qu.push({v, now.d + 1, Pmax[v]});
}

像这么写就可以很好的避免这种问题,其中 Pmax 数组表示当前节点可以生存的最大几率