func ShortestPath(g *graph.UnGraph, source graph.VertexId) map[graph.VertexId]graph.VertexId { visited := make(map[graph.VertexId]bool, g.VerticesCount()) dist := make(map[graph.VertexId]int) prev := make(map[graph.VertexId]graph.VertexId) Q := pq.NewMin() vertices := g.VerticesIter() dist[source] = 0 for vertex := range vertices { if source != vertex { dist[vertex] = 1000 prev[vertex] = 0 } Q.Insert(*pq.NewItem(vertex, dist[vertex])) } for Q.Len() > 0 { u := Q.Extract().Value.(graph.VertexId) visited[u] = true for neighbour := range g.GetNeighbours(u).VerticesIter() { if !visited[neighbour] { alt := dist[u] + g.GetEdge(u, neighbour) if alt < dist[neighbour] { dist[neighbour] = alt prev[neighbour] = u Q.ChangePriority(neighbour, alt) } } } } return prev }
func UndirectedDfs(g *graph.UnGraph, v graph.VertexId, fn func(graph.VertexId)) { s := stack.New() s.Push(v) visited := make(map[graph.VertexId]bool) for s.Len() > 0 { v := s.Pop().(graph.VertexId) if _, ok := visited[v]; !ok { visited[v] = true fn(v) neighbours := g.GetNeighbours(v).VerticesIter() for neighbour := range neighbours { s.Push(neighbour) } } } }