Leetcode1377-T 秒后青蛙的位置

16 篇文章 0 订阅

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值