https://leetcode-cn.com/problems/frog-position-after-t-seconds/
跳过的点不会往跳,而且是树,所以一直往下走。 判断路径长度和时刻t。
这道题比较麻烦,注意的点有:
无向树,非根节点需要忽略父亲,根节点不需要
若根节点到目标节点的路径长度大于时刻t,则不能到达
若根节点到目标节点的路径长度小于时刻t,需要判断目标节点是否是叶子节点,若是的话则原地跳,不影响,否则会继续往下跳。
class Solution {
public:
vector<vector<int> > graph;
vector<int> path;
int target;
bool find(int root){
path.push_back(root);
if(root==target){
return true;
}
for(int i=0;i<graph[root].size();i++){
if(root==1 || path[path.size()-2]!=graph[root][i] ){
if(find(graph[root][i]))
return true;
}
}
path.pop_back();
return false;
}
double frogPosition(int n, vector<vector<int>>& edges, int t, int target_) {
graph.resize(n+1);
target=target_;
for(int i=0;i<edges.size();i++){
int u=edges[i][0];
int v=edges[i][1];
graph[u].push_back(v);
graph[v].push_back(u);
}
find(1);
int path_len=path.size()-1;
if(t<path_len){
return 0;
}
if(t>path_len){
if(target==1&& graph[path[path.size()-1]].size()>0){
return 0;
}
if (target!=1 && graph[path[path.size()-1]].size()>1 ){
return 0;
}
}
double prob=1;
for(int i=0;i<path.size()-1;i++){
int son_num=graph[path[i]].size();
if(i!=0){
son_num--;
}
prob*=((double)1/son_num);
}
return prob;
}
};