← All problems

3558. Number of Ways to Assign Edge Weights I

MediumOpen on LeetCodeProblem statement

Problem Statement

3558. Number of Ways to Assign Edge Weights I

Medium


There is an undirected tree with n nodes labeled from 1 to n, rooted at node 1. The tree is represented by a 2D integer array edges of length n - 1, where edges[i] = [ui, vi] indicates that there is an edge between nodes ui and vi.

Initially, all edges have a weight of 0. You must assign each edge a weight of either 1 or 2.

The cost of a path between any two nodes u and v is the total weight of all edges in the path connecting them.

Select any one node x at the maximum depth. Return the number of ways to assign edge weights in the path from node 1 to x such that its total cost is odd.

Since the answer may be large, return it modulo 109 + 7.

Note: Ignore all edges not in the path from node 1 to x.

 

Example 1:

Input: edges = [[1,2]]

Output: 1

Explanation:

Example 2:

Input: edges = [[1,2],[1,3],[3,4],[3,5]]

Output: 2

Explanation:

 

Constraints:

Java

Source file
class Solution {
    public int assignEdgeWeights(int[][] edges) {
        // Construct graph (adjacency list)
        int n = edges.length;
        List<Integer>[] adj = new List[n + 2];
        for (int i = 0; i < n + 2; i++)
            adj[i] = new ArrayList<>();
        for (int[] e : edges) {
            adj[e[0]].add(e[1]);
            adj[e[1]].add(e[0]);
        }
        // Find max depth via dfs
        int maxDepth = dfs(1, adj, 0);
        // Calc. odd parity of 1 weighted edges, rest 2, viz - nC1+nC3+nC5+...nCn_or_n-1
        // Above series equates to 2^(n-1) via binary expansion
        // Now instead of pow(2, n-1)%10e7, we will use fast exponentiation
        return fastExponentiation(2, maxDepth - 1);
    }

    int dfs(int node, List<Integer>[] adj, int parent) {
        int maxDepth = 0;
        for (int child : adj[node]) {
            if (child == parent)
                continue;
            maxDepth = Math.max(maxDepth, dfs(child, adj, node) + 1);
        }
        return maxDepth;
    }

    static final int MOD = 1_000_000_007;

    int fastExponentiation(int x, int y) { // calc x^n % 10e7
        long ans = 1;
        long base = x;
        while (y > 0) {
            if ((y & 1) == 1)
                ans = (ans * base) % MOD;
            base = (base * base) % MOD;
            y >>= 1;
        }
        return (int) ans;
    }
}