maximum-path-quality-of-a-graph
This commit is contained in:
parent
8a83a543ba
commit
672c13b219
|
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue