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;
}
};
标签:cnt,int,signalSpeed,vector,3067,dfs,权树,节点
From: https://blog.csdn.net/weixin_46028214/article/details/139436306