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)