标签:list init 算法 assign Plan question nbsp out AC
An undirected, connected tree with N
nodes labelled 0...N-1
and N-1
edges
are given.
The i
th edge connects nodes edges[i][0]
and edges[i][1]
together.
Return a list ans
, where ans[i]
is the sum of the distances between node i
and all other nodes.
Input: N = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]
Output: [8,12,6,10,10,10]
Explanation:
Here is a diagram of the given tree:
0
/ 1 2
/| 3 4 5
We can see that dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5)
equals 1 + 1 + 2 + 2 + 2 = 8. Hence, answer[0] = 8, and so on.
1 <= N <= 10000
1 class Solution { 2 public: 3 //相当于图来存来处理 4 vector<vector<int>> tree; 5 vector<int> res; 6 vector<int> subc; 7 int n; 8 vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) { 9 //tree.rvec(N,vector<int>(N)); 10 //init 11 n = N; 12 tree.resize(N); //初始化的函数 13 res.assign(N,0); 14 subc.assign(N,0); 15 //build tree 16 for(auto e : edges){ //遍历的技巧 17 tree[e[0]].push_back(e[1]); 18 tree[e[1]].push_back(e[0]); 19 } 20 set<int> visited1; 21 set<int> visited2; 22 DFS_POST(0,visited1); //初始root任何值都行 23 DFS_PRE(0,visited2); 24 return res; 25 26 } 27 void DFS_POST(int root,set<int> &visited){ //传引用保存修改值 28 visited.insert(root); 29 for(auto i : tree[root]){ 30 if(visited.find(i) == visited.end() ){ 31 DFS_POST(i,visited); 32 subc[root] += subc[i]; 33 res[root] += res[i] + subc[i]; 34 } 35 } 36 subc[root]++; //加上自身节点 37 } 38 void DFS_PRE(int root,set<int> &visited){ 39 visited.insert(root); 40 for(auto i : tree[root]){ 41 if(visited.find(i) == visited.end()){ 42 res[i] = res[root] - subc[i] + n - subc[i]; //算法核心 43 DFS_PRE(i,visited); 44 } 45 } 46 } 47 48 };
主要函数是初始化的函数。
主要算法思想是先序和后续的递归遍历(DFS)。
实现O(n2)的算法核心方程是:res[i] = res[root] - subc[i] + n - subc[i];
834. Sum of Distances in Tree —— weekly contest 84
标签:list init 算法 assign Plan question nbsp out AC
原文地址:https://www.cnblogs.com/jinjin-2018/p/9034094.html