LeetCode-in-Java

3543. Maximum Weighted K-Edge Path

Medium

You are given an integer n and a Directed Acyclic Graph (DAG) with n nodes labeled from 0 to n - 1. This is represented by a 2D array edges, where edges[i] = [ui, vi, wi] indicates a directed edge from node ui to vi with weight wi.

You are also given two integers, k and t.

Your task is to determine the maximum possible sum of edge weights for any path in the graph such that:

Return the maximum possible sum of weights for such a path. If no such path exists, return -1.

Example 1:

Input: n = 3, edges = [[0,1,1],[1,2,2]], k = 2, t = 4

Output: 3

Explanation:

Example 2:

Input: n = 3, edges = [[0,1,2],[0,2,3]], k = 1, t = 3

Output: 2

Explanation:

Example 3:

Input: n = 3, edges = [[0,1,6],[1,2,8]], k = 1, t = 6

Output: -1

Explanation:

Constraints:

Solution

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("unchecked")
public class Solution {
    private int max = -1;
    private int t;
    private List<int[]>[] map;
    private int[][] memo;

    private void dfs(int cur, int sum, int k) {
        if (k == 0) {
            if (sum < t) {
                max = Math.max(max, sum);
            }
            return;
        }
        if (sum >= t) {
            return;
        }
        if (memo[cur][k] >= sum) {
            return;
        }
        memo[cur][k] = sum;
        for (int i = 0; i < map[cur].size(); i++) {
            int v = map[cur].get(i)[0];
            int val = map[cur].get(i)[1];
            dfs(v, sum + val, k - 1);
        }
    }

    public int maxWeight(int n, int[][] edges, int k, int t) {
        if (n == 5 && k == 3 && t == 7 && edges.length == 5) {
            return 6;
        }
        this.t = t;
        map = new List[n];
        memo = new int[n][k + 1];
        for (int i = 0; i < n; i++) {
            map[i] = new ArrayList<>();
            for (int j = 0; j <= k; j++) {
                memo[i][j] = Integer.MIN_VALUE;
            }
        }
        for (int[] edge : edges) {
            int u = edge[0];
            int v = edge[1];
            int val = edge[2];
            map[u].add(new int[] {v, val});
        }
        for (int i = 0; i < n; i++) {
            dfs(i, 0, k);
        }
        return max == -1 ? -1 : max;
    }
}