-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCount_Subtrees_With_Max_Distance_Between_Cities.cpp
47 lines (45 loc) · 1.52 KB
/
Count_Subtrees_With_Max_Distance_Between_Cities.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public:
struct subtreeinfo{
int depth;
int diameter;
subtreeinfo(int d,int dia){
depth = d;
diameter = dia;
}
};
vector<subtreeinfo>dfs(int idx,vector<int>&result,vector<int>adj[],vector<bool>&visited){
vector<subtreeinfo>subtree;
subtree.push_back(subtreeinfo(0,0));
visited[idx] = true;
for(auto i : adj[idx]){
if(visited[i]){
continue;
}
int num = subtree.size();
auto childsubtree = dfs(i,result,adj,visited);
for(auto &child: childsubtree){
for(int j = 0; j < num ; j++){
auto tree = subtree[j];
subtreeinfo newsubtree(-1,-1);
newsubtree.depth = max(tree.depth,child.depth+1);
newsubtree.diameter = max(tree.diameter,max(tree.depth+child.depth + 1,child.diameter));
result[newsubtree.diameter-1]++;
subtree.push_back(newsubtree);
}
}
}
return subtree;
}
vector<int> countSubgraphsForEachDiameter(int n, vector<vector<int>>& edges) {
vector<int>adj[n+1];
for(int i = 0; i < edges.size(); i++){
adj[edges[i][0]].push_back(edges[i][1]);
adj[edges[i][1]].push_back(edges[i][0]);
}
vector<int>result(n-1,0);
vector<bool>visited(n+1,false);
dfs(1,result,adj,visited);
return result;
}
};