C++ 中 T 秒后青蛙的位置


假设我们有一个由 n 个顶点组成的无向树。顶点编号从 1 到 n。现在一只青蛙从顶点 1 开始跳跃。如果青蛙当前的顶点和另一个未访问的顶点相邻,它可以在一秒钟内跳到该顶点。青蛙不能跳回已访问的顶点。如果青蛙可以跳到多个顶点,它会随机跳到其中一个顶点

概率相同,否则,当青蛙无法跳到任何未访问的顶点时,它会永远停留在同一个顶点上。

树以边的数组形式给出。我们必须找到青蛙在 t 秒后位于顶点 target 的概率。

因此,如果输入类似于 n 为 7,t 为 2,target 为 4,树类似于 -

那么输出将为 0.1666,从图中可以看出。青蛙从顶点 1 开始,以 0.3333 的概率在第 1 秒跳到顶点 2,然后以 0.5 的概率在第 2 秒跳到顶点 4。因此,青蛙在 2 秒后位于顶点 4 的概率为 0.3333 * 0.5 = 1.6665。

为了解决这个问题,我们将遵循以下步骤 -

  • ret := 1

  • 定义一个集合 visited

  • 定义一个函数 dfs(),它将接收节点、起点、边列表 g、时间、t、一个栈 st,

  • 如果节点是 visited 的成员,则 -

    • 返回 false

  • 将节点插入 visited

  • 如果节点与 1 相同,则 -

    • tt := time,ok := true

    • 返回 true

  • 对于初始化 i := 0,当 i < g[node] 的大小,更新(将 i 增加 1),执行 -

    • 将 g[node, i] 插入 st

    • 如果 dfs(g[node, i], start, g, time + 1, t, st) 为 true,则 -

      • 返回 true

    • 从 st 中删除元素

  • 返回 false

  • 从主方法执行以下操作 -

  • ret := 1

  • ok := false

  • 定义一个大小为 n + 1 的列表数组 graph

  • 定义一个大小为 n + 1 的列表数组 graph2

  • 对于初始化 i := 0,当 i < edges 的大小,更新(将 i 增加 1),执行 -

    • 将 edges[i, 1] 插入 graph[edges[i, 0]] 的末尾

    • 将 edges[i, 0] 插入 graph[edges[i, 1]] 的末尾

  • 定义一个栈 st

  • dfs(target, target, graph, 0, t, st)

  • 当 (st 不为空) 时,执行 -

    • node := st 的顶部元素

    • sz := graph[node] 的大小

    • 如果 node 不等于 1,则 -

      • (将 sz 减 1)

    • ret := ret * (1.0 / sz)

    • 从 st 中删除元素

  • 如果 tt > t,则 -

    • 返回 0

  • 如果 tt 与 t 相同,则 -

    • 返回 ret

  • 如果 tt < t 且 target 与 1 相同且 graph[target] 的大小 >= 1,则 -

    • 返回 0

  • 返回(如果 tt < t 且 graph[target] 的大小 > 1,则为 0,否则为 ret)

让我们看看以下实现以更好地理解 -

示例

 实时演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   double ret = 1;
   bool ok;
   set<int> visited;
   int tt;
   bool dfs(int node, int start, vector<int> g[], int time, int t,
   stack<int>& st){
      if (visited.count(node))
      return false;
      visited.insert(node);
      if (node == 1) {
         tt = time;
         ok = true;
         return true;
      }
      for (int i = 0; i < g[node].size(); i++) {
         st.push(g[node][i]);
         if (dfs(g[node][i], start, g, time + 1, t, st))
         return true;
         ;
         st.pop();
      }
      return false;
   }
   double frogPosition(int n, vector<vector<int> >& edges, int t,
   int target){
      ret = 1;
      ok = false;
      vector<int> graph[n + 1];
      vector<int> graph2[n + 1];
      for (int i = 0; i < edges.size(); i++) {
         graph[edges[i][0]].push_back(edges[i][1]);
         graph[edges[i][1]].push_back(edges[i][0]);
      }
      stack<int> st;
      dfs(target, target, graph, 0, t, st);
      while (!st.empty()) {
         int node = st.top();
         double sz = (double)graph[node].size();
         if (node != 1)
         sz--;
         ret *= (1.0 / sz);
         st.pop();
      }
      if (tt > t)
      return 0;
      if (tt == t)
      return ret;
      if (tt < t && target == 1 && graph[target].size() >= 1)
      return 0;
      return tt < t && graph[target].size() > 1 ? 0 : ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{1,2},{1,3},{1,7},{2,4},{2,6},{3,5}};
   cout << (ob.frogPosition(7,v,2,4));
}

输入

7, {{1,2},{1,3},{1,7},{2,4},{2,6},{3,5}}, 2, 4

输出

0.166667

更新于: 2020-06-09

273 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告