- Tree Longest Path With Same Value
中文English
We consider an undirected tree with N nodes, numbered from 1 to N, Additionally, each node also has a label attached to it and the label is an integer value. Note that different nodes can have identical labels. You need to write a function , that , given a zero-indexed array A of length N, where A[J] is the label value of the (J + 1)-th node in the tree, and a zero-indexed array E of length K = (N - 1) * 2 in which the edges of the tree are described (for every 0 <= j <= N -2 values E[2 * J] and E[2 * J + 1] represents and edge connecting node E[2 * J] with node E[2 * J + 1]), returns the length of the longest path such that all the nodes on that path have the same label. Then length of a path if defined as the number of edges in that path.
Example
Example1
Input: A = [1, 1, 1 ,2, 2] and E = [1, 2, 1, 3, 2, 4, 2, 5]
Output: 2
Explanation:
described tree appears as follows:
1 (value = 1) / \ z (value = 1) 2 3 (value = 1) / \ (value = 2) 4 5 (value = 2)
The longest path (in which all nodes have the save value of 1) is (2 -> 1 -> 3). The number of edges on this path is 2, thus, that is the answer.
Example2
Input: A = [1, 2, 1 ,2, 2] and E = [1, 2, 1, 3, 2, 4, 2, 5]
Output: 2
Explanation:
described tree appears as follows:
1 (value = 1) / \ (value = 2) 2 3 (value = 1) / \ (value = 2) 4 5 (value = 2)
The longest path (in which all nodes have the save value of 2) is (4 -> 2 -> 5). The number of edges on this path is 2, thus, that is the answer.
Notice
Assume that: 1 <= N <= 1000
解法1:DFS
注意dfs的写法必须是dfs(…, len + 1),而不能是
len++;
dfs(…, len)。
代码如下:
class Solution {
public:
/**
* @param A: as indicated in the description
* @param E: as indicated in the description
* @return: Return the number of edges on the longest path with same value.
*/
int LongestPathWithSameValue(vector<int> &A, vector<int> &E) {
int Asize = A.size();
if (Asize == 0) return 0;
int Esize = E.size();
if (Esize != (Asize - 1) * 2) return 0;
maxLength = 0;
visited.resize(Asize + 1, 0);
for (int i = 0; i < Esize; i += 2) {
mp[E[i]].insert(E[i + 1]);
mp[E[i + 1]].insert(E[i]);
}
for (int i = 1; i <= Asize; ++i) {
dfs(A, E, i, 0);
}
return maxLength;
}
private:
void dfs(vector<int> &A, vector<int> &E, int startNode, int len) {
if (visited[startNode]) return;
visited[startNode] = 1;
maxLength = max(maxLength, len);
for (auto node : mp[startNode]) {
if (A[node - 1] == A[startNode - 1]) {
dfs(A, E, node, len + 1);
}
}
visited[startNode] = 0;
}
map<int, set<int>> mp;
int maxLength;
vector<int> visited;
};