(nice!!!)LeetCode 3067. 在带权树网络中统计可连接服务器对数目(深度优先搜索dfs、树)

3067. 在带权树网络中统计可连接服务器对数目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:节点数最多1000,那么我们0(n^2)的时间复杂度就ok了。我们可以用一层for循环遍历每一个点i,然后第二层for循环遍历每一条可能的边j,通过用dfs来找到符合“到根节点i的距离可以被signalSpeed整除”的点。不同子节点之间两两组合,得到满足要求的组合。
dfs函数里的参数有:当前节点u、父节点fa、到根节点i的距离dis、signalSpeed
返回值是:符合“到根节点i的距离可以被signalSpeed整除

class Solution {
public:
    vector<vector<pair<int,int>>> g;
    vector<int> v;

    int dfs(int u,int fa,int dis,int &signalSpeed){
        int cnt=(dis%signalSpeed)==0;
        for(int i=0;i<g[u].size();i++){
            if(g[u][i].first==fa) continue;
            cnt+=dfs(g[u][i].first,u,dis+g[u][i].second,signalSpeed);
        }
        return cnt;
    }
    vector<int> countPairsOfConnectableServers(vector<vector<int>>& edges, int signalSpeed) {
        int n=edges.size()+1;
        g=vector<vector<pair<int,int>>>(n);
        v=vector<int>(n,0);
        //先转化为邻接表
        for(int i=0;i<n-1;i++){
            int x=edges[i][0],y=edges[i][1],w=edges[i][2];
            g[x].push_back({y,w});
            g[y].push_back({x,w});
        }
        //遍历每一个点
        for(int i=0;i<n;i++){
            int cnt=0;
            int sum=0;
            //遍历链接节点i的每一条边
            for(int j=0;j<g[i].size();j++){
            	//返回的t是符合“到根节点i的距离可以被signalSpeed整除”的点的总数
                int t=dfs(g[i][j].first,i,g[i][j].second,signalSpeed);
                //两两组合
                cnt+=t*sum;
                sum+=t;
            }
            v[i]=cnt;
        }
        return v;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值