From f848a7b9c77e46f34e96fce99e2283543bac25da Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Sat, 31 Aug 2024 21:32:31 +0200 Subject: [PATCH] =?UTF-8?q?go:=20add=20=C2=AB1514.=20Path=20with=20Maximum?= =?UTF-8?q?=20Probability=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- go/path-with-maximum-probability.go | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 go/path-with-maximum-probability.go diff --git a/go/path-with-maximum-probability.go b/go/path-with-maximum-probability.go new file mode 100644 index 0000000..95b91a7 --- /dev/null +++ b/go/path-with-maximum-probability.go @@ -0,0 +1,59 @@ +package main + +import ( + "cmp" + + pq "github.com/emirpasic/gods/v2/queues/priorityqueue" +) + +func maxProbability(n int, edges [][]int, succProb []float64, start int, end int) float64 { + type Edge struct { + v int + p float64 + } + + makeGraph := func() [][]Edge { + g := make([][]Edge, n) + + for i, edge := range edges { + u, v, p := edge[0], edge[1], succProb[i] + + g[u] = append(g[u], Edge{v: v, p: p}) + g[v] = append(g[v], Edge{v: u, p: p}) + } + + return g + } + g := makeGraph() + + type Entry struct { + probability float64 + u int + } + byProbability := func(a, b Entry) int { + return -cmp.Compare(a.probability, b.probability) + } + + maxP := make([]float64, n) + q := pq.NewWith(byProbability) + + maxP[start] = 1 + q.Enqueue(Entry{probability: maxP[start], u: start}) + + for candidate, ok := q.Dequeue(); ok; candidate, ok = q.Dequeue() { + if candidate.u == end { + return candidate.probability + } + + for _, edge := range g[candidate.u] { + p := candidate.probability * edge.p + + if p > maxP[edge.v] { + maxP[edge.v] = p + q.Enqueue(Entry{probability: p, u: edge.v}) + } + } + } + + return 0 +}