BFS: TLE
class Solution {
public int maxWeight(int n, int[][] edges, int k, int t) {
if (k > n)
return -1;
List<List<Edge>> adj = new ArrayList<>();
for (int i = 0; i < n; i++)
adj.add(new ArrayList<>());
for (int edge[] : edges) {
Edge e = new Edge(edge[1], edge[2]);
adj.get(edge[0]).add(e);
}
int maxSum = -1;
for (int i = 0; i < n; i++) {
maxSum = Math.max(maxSum, bfs(i, adj, t, k));
}
return maxSum;
}
public int bfs(int node, List<List<Edge>> adj, int T, int k) {
Queue<Tuple> q = new LinkedList<>();
q.add(new Tuple(node, 0, 0));// current node, cost to reach current node, and no of edges so far
int max = -1;
while (!q.isEmpty()) {
Tuple t = q.remove();
if (t.d < T && t.e == k) {
max = Math.max(max, t.d);
}
for (Edge e : adj.get(t.n)) {
int sum = t.d + e.c;
int noOfEdgesSoFar = t.e + 1;
if (sum < T && noOfEdgesSoFar <= k) {
if (noOfEdgesSoFar == k) {
max = Math.max(max, sum);
} else {
q.add(new Tuple(e.n, sum, noOfEdgesSoFar));
}
}
}
}
return max;
}
}
class Edge {
int n;
int c;
public Edge(int n, int c) {
this.n = n;
this.c = c;
}
}
class Tuple {
int n;
int d;
int e;
public Tuple(int n, int d, int e) {
this.n = n;
this.d = d;
this.e = e;
}
}
DFS : TLE
class Solution {
public int maxWeight(int n, int[][] edges, int k, int t) {
if(k>n) return -1;
List<List<Edge>> adj = new ArrayList<>();
for(int i =0;i<n;i++) adj.add(new ArrayList<>());
for(int edge[] : edges){
Edge e = new Edge(edge[1], edge[2]);
adj.get(edge[0]).add(e);
}
int maxSum = -1;
for(int i =0;i<n;i++){
maxSum = Math.max(maxSum,dfs(new Tuple(i,0,0),adj,t, k));
}
return maxSum;
}
public int dfs(Tuple t, List<List<Edge>> adj, int T, int k){
if(t.e == k){
if(t.d < T) return t.d;
return -1;
}
int max = -1;
for(Edge e : adj.get(t.n)){
int sum = t.d + e.c;
int noOfEdgesSoFar = t.e + 1;
if(sum<T && noOfEdgesSoFar<=k){
max = Math.max(max, dfs(new Tuple(e.n, sum, noOfEdgesSoFar), adj, T, k));
}
}
return max;
}
}
class Edge{
int n;//to node
int c;//edge weight
public Edge(int n ,int c){
this.n = n;
this.c =c;
}
}
class Tuple{
int n;//node
int d;//cost so far
int e;//noOfEdgesSoFar
public Tuple(int n ,int d, int e){
this.n = n;
this.d = d;
this.e = e;
}
}
dp with memoization: works
class Solution {
public int maxWeight(int n, int[][] edges, int k, int t) {
if(k>n) return -1;
List<List<Edge>> adj = new ArrayList<>();
for(int i =0;i<n;i++) adj.add(new ArrayList<>());
for(int edge[] : edges){
Edge e = new Edge(edge[1], edge[2]);
adj.get(edge[0]).add(e);
}
int maxSum = -1;
Map<Tuple,Integer> dp = new HashMap<>();
for(int i =0;i<n;i++){
maxSum = Math.max(maxSum,dfs(new Tuple(i,0,0),adj,t, k,dp));
}
return maxSum;
}
public int dfs(Tuple t, List<List<Edge>> adj, int T, int k,Map<Tuple,Integer> map){
if(t.e == k){
if(t.d < T) return t.d;
return -1;
}
if(map.containsKey(t)) return map.get(t);
int max = -1;
for(Edge e : adj.get(t.n)){
int sum = t.d + e.c;
int noOfEdgesSoFar = t.e + 1;
if(sum<T && noOfEdgesSoFar<=k){
max = Math.max(max, dfs(new Tuple(e.n, sum, noOfEdgesSoFar), adj, T, k,map));
}
}
map.put(t, max);
return map.get(t);
}
}
class Edge{
int n;
int c;
public Edge(int n ,int c){
this.n = n;
this.c =c;
}
}
class Tuple{
int n;
int d;
int e;
public Tuple(int n ,int d, int e){
this.n = n;
this.d = d;
this.e = e;
}
@Override
public boolean equals(Object o){
if(o ==null) return false;
if(o== this) return true;
if(o.getClass()!= this.getClass()) return false;
Tuple t = (Tuple) o;
if(t.n != this.n || t.d != this.d || t.e != this.e) return false;
return true;
}
@Override
public int hashCode(){
return Arrays.hashCode(new int[]{this.n, this.d, this.e});
}
}
Top comments (0)