|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + |
| 6 | + "github.com/danrusei/algorithms_with_Go/graph" |
| 7 | +) |
| 8 | + |
| 9 | +type bridges struct { |
| 10 | + *graph.Graph |
| 11 | +} |
| 12 | + |
| 13 | +func (g *bridges) findBridge() { |
| 14 | + |
| 15 | + totalNodes := len(g.Nodes) |
| 16 | + |
| 17 | + for _, node := range g.Nodes { |
| 18 | + for _, edge := range g.Edges[node] { |
| 19 | + //remove the (u, v) edge from graph |
| 20 | + g.RemoveEdge(node, edge.ToNode) |
| 21 | + |
| 22 | + //check if bfs traversal returns the same number of nodes as expected |
| 23 | + if g.BFStraverse(node) != totalNodes { |
| 24 | + fmt.Printf("Edge %v --- %v is a bridge\n", edge.ToNode, node) |
| 25 | + } |
| 26 | + |
| 27 | + // add again the (u, v) edge to graph, in order to check the other edges as well |
| 28 | + g.AddEdge(node, edge.ToNode) |
| 29 | + } |
| 30 | + } |
| 31 | +} |
| 32 | + |
| 33 | +// BFS(Breadth First Search) traversal of the Graph |
| 34 | +// check out https://github.com/danrusei/algorithms_with_Go/tree/main/graph/traverse_bfs |
| 35 | +//for detailed explanation of the algorithm |
| 36 | +func (g *bridges) BFStraverse(n *graph.Node) int { |
| 37 | + // Create a queue for BFS |
| 38 | + queue := make([]*graph.Node, 0, len(g.Nodes)) |
| 39 | + |
| 40 | + queue = append(queue, n) |
| 41 | + visited := make(map[*graph.Node]bool) |
| 42 | + |
| 43 | + for len(queue) > 0 { |
| 44 | + node := queue[0] |
| 45 | + //pop out the Node from the queue |
| 46 | + queue = queue[1:] |
| 47 | + // add the Node to visited map, ensuring that it will not be added again to the queue |
| 48 | + // this prevents to loop endlesssly through the nodes |
| 49 | + visited[node] = true |
| 50 | + |
| 51 | + //edges are the links to other Nodes of the searching Node |
| 52 | + for _, edge := range g.Edges[node] { |
| 53 | + if !visited[edge.ToNode] { |
| 54 | + newNode := edge.ToNode |
| 55 | + queue = append(queue, newNode) |
| 56 | + visited[newNode] = true |
| 57 | + } |
| 58 | + |
| 59 | + } |
| 60 | + |
| 61 | + } |
| 62 | + return len(visited) |
| 63 | +} |
| 64 | + |
| 65 | +func main() { |
| 66 | + // create nodes |
| 67 | + n0 := graph.Node{Value: "0"} |
| 68 | + n1 := graph.Node{Value: "1"} |
| 69 | + n2 := graph.Node{Value: "2"} |
| 70 | + n3 := graph.Node{Value: "3"} |
| 71 | + n4 := graph.Node{Value: "4"} |
| 72 | + |
| 73 | + // create a new graph instance |
| 74 | + g := new(graph.Graph) |
| 75 | + |
| 76 | + // add nodes to graph |
| 77 | + g.AddNode(&n0) |
| 78 | + g.AddNode(&n1) |
| 79 | + g.AddNode(&n2) |
| 80 | + g.AddNode(&n3) |
| 81 | + g.AddNode(&n4) |
| 82 | + |
| 83 | + // add the edges(links) between nodes |
| 84 | + g.AddEdge(&n0, &n1) |
| 85 | + g.AddEdge(&n0, &n3) |
| 86 | + g.AddEdge(&n0, &n2) |
| 87 | + g.AddEdge(&n1, &n2) |
| 88 | + g.AddEdge(&n3, &n4) |
| 89 | + |
| 90 | + s := &bridges{g} |
| 91 | + s.findBridge() |
| 92 | +} |
0 commit comments