From 672c13b219038a2f7f3c1a4e721b34141cf01a58 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Wed, 10 Nov 2021 14:32:05 +0000 Subject: [PATCH] maximum-path-quality-of-a-graph --- maximum-path-quality-of-a-graph/sol.go | 70 ++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 maximum-path-quality-of-a-graph/sol.go diff --git a/maximum-path-quality-of-a-graph/sol.go b/maximum-path-quality-of-a-graph/sol.go new file mode 100644 index 0000000..f7ad5b5 --- /dev/null +++ b/maximum-path-quality-of-a-graph/sol.go @@ -0,0 +1,70 @@ +package main + +type Next struct { + Visited map[int]bool + Time int + Node int +} + +type Edge struct { + To int + Time int +} + +// Horrible, unoptimised solution that I could come up with +// Should learn how to do depth-first-search properly +func maximalPathQuality(values []int, edges [][]int, maxTime int) int { + next := []*Next{ + { + Visited: map[int]bool{0: true}, + Time: 0, + Node: 0, + }, + } + es := map[int][]*Edge{} + for _, edge := range edges { + _, ok := es[edge[0]] + if !ok { + es[edge[0]] = []*Edge{} + } + _, ok = es[edge[1]] + if !ok { + es[edge[1]] = []*Edge{} + } + es[edge[0]] = append(es[edge[0]], &Edge{To: edge[1], Time: edge[2]}) + es[edge[1]] = append(es[edge[1]], &Edge{To: edge[0], Time: edge[2]}) + } + maxQuality := values[0] + for len(next) != 0 { + _next := []*Next{} + for _, n := range next { + if n.Node == 0 && n.Time != 0 { + q := 0 + for node := range n.Visited { + q += values[node] + } + if q > maxQuality { + maxQuality = q + } + } + nedges, ok := es[n.Node] + if ok { + for _, nedge := range nedges { + if !(n.Time+nedge.Time > maxTime) { + v := map[int]bool{nedge.To: true} + for key := range n.Visited { + v[key] = true + } + _next = append(_next, &Next{ + Visited: v, + Time: n.Time + nedge.Time, + Node: nedge.To, + }) + } + } + } + } + next = _next + } + return maxQuality +}