Bridges in a connected graph

后端 未结 3 639
长发绾君心
长发绾君心 2020-12-04 15:56

I have a programming task(not homework.) where I have to find the bridges in a graph. I worked on it a bit myself, but could not come up with anything satisfactory. So i goo

3条回答
  •  萌比男神i
    2020-12-04 16:32

    Not a new answer, but I needed this for the JVM/Kotlin. Here's a translation that relies upon com.google.common.graph.Graph.

    /**
     * [T] The type of key held in the [graph].
     */
    private class BridgeComputer(private val graph: ImmutableGraph) {
        /**
         * Counter.
         */
        private var count = 0
        /**
         * `low[v]` = Lowest preorder of any vertex connected to `v`.
         */
        private val low: MutableMap =
            graph.nodes().map { it to -1 }.toMap(mutableMapOf())
        /**
         * `pre[v]` = Order in which [depthFirstSearch] examines `v`.
         */
        private val pre: MutableMap =
            graph.nodes().map { it to -1 }.toMap(mutableMapOf())
    
        private val foundBridges = mutableSetOf>()
    
        init {
            graph.nodes().forEach { v ->
                // DO NOT PRE-FILTER!
                if (pre[v] == -1) {
                    depthFirstSearch(v, v)
                }
            }
        }
    
        private fun depthFirstSearch(u: T, v: T) {
            pre[v] = count++
            low[v] = checkNotNull(pre[v]) { "pre[v]" }
            graph.adjacentNodes(v).forEach { w ->
                if (pre[w] == -1) {
                    depthFirstSearch(v, w)
                    low[v] =
                        Math.min(checkNotNull(low[v]) { "low[v]" }, checkNotNull(low[w]) { "low[w]" })
                    if (low[w] == pre[w]) {
                        println("$v - $w is a bridge")
                        foundBridges += (v to w)
                    }
                } else if (w != u) {
                    low[v] =
                        Math.min(checkNotNull(low[v]) { "low[v]" }, checkNotNull(pre[w]) { "pre[w]" })
                }
            }
        }
    
        /**
         * Holds the computed bridges.
         */
        fun bridges() = ImmutableSet.copyOf(foundBridges)!!
    }
    

    Hopefully this makes someone's life easier.

提交回复
热议问题