forked from starwander/goraph
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkisp.go
40 lines (34 loc) · 1.07 KB
/
kisp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Copyright(c) 2016 Ethan Zhuang <[email protected]>.
package goraph
import (
"math"
)
// Kisp gets top k shortest independent path between two vertex in the graph.
// Independent means no vertex is shared between path.
func (graph *Graph) Kisp(source, destination ID, topK int) ([]float64, [][]ID, error) {
var err error
var i, k int
var dijkstraDist map[ID]float64
var dijkstraPrev map[ID]ID
distTopK := make([]float64, topK)
pathTopK := make([][]ID, topK)
for i := 0; i < topK; i++ {
distTopK[i] = math.Inf(1)
}
dijkstraDist, dijkstraPrev, err = graph.Dijkstra(source)
if err != nil {
return nil, nil, err
}
distTopK[0] = dijkstraDist[destination]
pathTopK[0] = getPath(dijkstraPrev, destination)
for k = 1; k < topK && distTopK[k-1] != math.Inf(1); k++ {
for i = 0; i < len(pathTopK[k-1])-1; i++ {
graph.DisableEdge(pathTopK[k-1][i], pathTopK[k-1][i+1])
}
dijkstraDist, dijkstraPrev, _ = graph.Dijkstra(source)
distTopK[k] = dijkstraDist[destination]
pathTopK[k] = getPath(dijkstraPrev, destination)
}
graph.Reset()
return distTopK, pathTopK, nil
}