dfs
①首先把边集转换为邻接表建图。
②dfs求所有结点的父节点。
③求根结点到目标结点上经过了哪些结点。
④累乘这些经过的结点的子节点个数,先求出答案的分母。
⑤返回答案。
⑥无解的情况:
Ⅰ:经过的结点个数多于t。
Ⅱ:经过的结点个数少于t但是目标节点不是叶子结点。
class Solution {
public:
double frogPosition(int n, vector<vector<int>>& edges, int t, int target) {
vector<vector<int>> g(n+1);
vector<int> p(n+1),path;
for(auto p:edges){
g[p[0]].push_back(p[1]);
g[p[1]].push_back(p[0]);
}
g[1].push_back(-1);
function<void(int,int)> dfs=[&](int x,int fa){
p[x]=fa;
for(auto y:g[x]){
if(y==p[x]) continue;
dfs(y,x);
}
};
dfs(1,-1);
int c=target;
long long cnt=1;
while(c!=-1){
c=p[c];
path.push_back(c);
}
path.pop_back();
if(t<path.size()) return 0;
if(t>path.size()&&g[target].size()!=1) return 0;
for(auto t:path) cnt*=1LL*g[t].size()-1;
return (double)1/cnt;
}
};
时间复杂度:O(n),n为结点个数
空间复杂度:O(n)

本文介绍了一种使用深度优先搜索(DFS)算法来计算特定条件下青蛙从根节点跳到目标节点的概率的方法。通过构建邻接表并追踪路径上的节点,可以有效地求解问题,并考虑了边界情况。
939

被折叠的 条评论
为什么被折叠?



