https://leetcode.com/problems/maximum-number-of-k-divisible-components/description/
在一棵無向樹中,有 n
個節點,0
- n - 1
給定二維整數陣列 edges
,其中 edges[i] = [ai, bi]
表示在樹中節點 a_i
和節點 b_i
之間有一條邊
給定整數陣列 values
,其中 values[i]
是與第 i
個節點相關聯的值,還有一個整數 k
定義樹之有效分割為:通過刪除樹中的一組邊(可以是空集)使所有的連通分量的值都能被 k
整除,其中連通分量的值是該分量中所有節點的值的總和
回傳任何有效分割中最大的連通分量數量
講到連通分量,那可以考慮看看 DFS
C++ 參考解答:
struct Graph
{
int numNode;
vector<vector<int>> adjList;
Graph(int n, const vector<vector<int>> &edges) : numNode(n), adjList(n)
{
for (const auto &edge : edges)
{
adjList[edge[0]].push_back(edge[1]);
adjList[edge[1]].push_back(edge[0]);
}
}
};
class Solution
{
public:
int maxKDivisibleComponents(int n, vector<vector<int>> &edges, vector<int> &values, int k)
{
Graph g(n, edges);
int ans = 0;
dfs(g, 0, -1, values, k, ans);
return ans;
}
private:
long long dfs(const Graph &g, int u, int prev, const vector<int> &values, const int k, int &ans)
{
long long sum = values[u];
for (const int v : g.adjList[u])
{
if (v != prev)
sum += dfs(g, v, u, values, k, ans);
}
if (sum % k == 0)
++ans;
return sum;
}
};
Go 參考解答:
type Graph struct {
adjList [][]int
ans int
}
func buildGraph(n int, edges [][]int) [][]int {
graph := make([][]int, n)
for i := 0; i < n; i++ {
graph[i] = make([]int, 0, 10)
}
for _, edge := range edges {
u, v := edge[0], edge[1]
graph[u] = append(graph[u], v)
graph[v] = append(graph[v], u)
}
return graph
}
func maxKDivisibleComponents(n int, edges [][]int, values []int, k int) int {
g := Graph{adjList: buildGraph(n, edges), ans: 0}
g.dfs(0, -1, values, k)
return g.ans
}
func (g *Graph) dfs(u, p int, values []int, k int) int {
sum := values[u]
for _, v := range g.adjList[u] {
if v != p {
sum += g.dfs(v, u, values, k)
}
}
if sum%k == 0 {
g.ans++
}
return sum
}
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up