美文网首页
无向连通图中“割边”、“关键桥”问题的Java实现

无向连通图中“割边”、“关键桥”问题的Java实现

作者: 进击的NULL | 来源:发表于2019-01-12 12:11 被阅读0次

同割点问题(参见我的上一篇博客)类似,割点问题(也叫关键桥问题)描述的是在无向图中,倘若去掉某条边之后,原连通图被分割为两个不可达的图,则该条边就是所谓的割边。跟割点唯一不同的就是原本low[v] >= num[u]的判定条件变为了low[v] > num[u],也就是要满足子节点v现在连父节点u都不能到达,那么两节点组成的边就是割边!代码:

package cut.edge;

import java.util.Scanner;

/**
 * "轰炸重要桥"问题:
 * 关键词:DFS、割边、无向连通图、关键桥
 * @author XZP
 *一组测试数据:
6 6 
1 4 
1 3 
4 2
3 2
2 5 
5 6
 */
public class BombingImportantBridge {
    public static int index; // 时间戳
    public static void main(String[] args) {
        int INF = 99999; // 人为设定的最大值
        int i, j; // 游标
        int v1, v2; // 暂存顶点编号
        int root; // 根节点的编号
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 顶点数
        int m = sc.nextInt(); // 边的条数
        // 存储边的数组
        int[][] edges = new int[n + 1][n + 1];
        int[] num = new int[n + 1]; // 存储第一遍dfs遍历的时间戳
        int[] low = new int[n + 1]; // 存储最小时间戳的数组
        // 输入边的信息
        for (i = 1; i<= m; i++) {
            v1 = sc.nextInt();
            v2 = sc.nextInt();
            edges[v1][v2] = 1;
            edges[v2][v1] = 1;
        }
        root = 1;
        dfs(1, root, low, num, n, edges);
        
    }
    /**
     * 深度优先求“割边”
     * @param child
     * @param father
     * @param low
     * @param num
     * @param n
     * @param edges
     */
    public static void dfs(int child, int father, int[] low, int[] num, int n, int[][] edges) {
        int i, j;
        index++;
        num[child] = index;
        low[child] = index;
        for (i = 1; i <= n; i++) {
            if (edges[child][i] == 1) {
                if (num[i] == 0) {
                    dfs(i, child, low, num, n, edges);
                    low[child] = min(low[i], low[child]);
                    if (low[i] > num[child]) { // 关键步骤,跟割点差不多,只是这里没有等号,表示不经过父节点,该点就不能达到祖先(包括父节点)那两点组成的边即割边
                        System.out.println("割边为 " + child + " - " + i);
                    }
                } else if (i != father) {
                    low[child] = min(low[child], num[i]);
                }
            }
        }
    }
    /**
     * 求两个数中的较小值
     * @param a
     * @param b
     * @return
     */
    public static int min(int a, int b) {
        return a > b ? b : a;
    }
}

//***********实践证明:这种存储方式在某些情况下比较优化,但是由于dfs便于找到下一个顶点,最好还是用邻接矩阵*******************
/**
 * 表示一条边的对象
 * @author XZP
 *
 */
class Edge {
    private int v1;
    private int v2;
    public Edge(int v1, int v2) {
        this.v1 = v1;
        this.v2 = v2;
    }
    // getter
    public int getV1() {
        return v1;
    }
    public int getV2() {
        return v2;
    }
}

相关文章

  • 无向连通图中“割边”、“关键桥”问题的Java实现

    同割点问题(参见我的上一篇博客)类似,割点问题(也叫关键桥问题)描述的是在无向图中,倘若去掉某条边之后,原连通图被...

  • 图论-----求割点

    求无向连通图割点(java)-------Tarjan算法 在无向连通图中,如果将其中一个点以及所有连接该点的边去...

  • Tarjan算法求割点和桥

    定义: 割点:在一个无向连通图中,若删除某点后,图变成不连通,则称该点为该图的割点。 桥:在一个无向连通图中,若删...

  • Java实现无向连通图中的“割点”问题

    直接上代码,详细请见注释或者下方留言。 *************************************...

  • Tarjan算法求割点,桥

    下面介绍中无向图中割点和桥的概念:割点:一个结点称为割点(或者割顶)当且仅当去掉该节点极其相关的边之后的子图不连通...

  • 无向图求割点和割边——Tarjan算法

    无向图中求割点集和割边集——Tarjan算法割点和割边定义在一个无向图中,如果删除了某个顶点及与之相连的所有边,产...

  • 数据结构(十):最小生成树

    最小生成树是带权无向连通图中权值最小的生成树,根据图中生成树定义可知, 个顶点的连通图中,生成树中边的个数为 ,向...

  • 数据结构 图Graph

    一些概念: 连通图:在无向图中,若任意两个顶点v与u都有路径相通,则称该无向图为连通图。 强连通图:在有向图中,若...

  • 图论-邻接矩阵遍历搜索(Java)

    图中的元素称为“顶点”,如果两个顶点是连通的,连通的线叫作“边”,两点之间的距离叫作“权”,对于无向边(AB顶点相...

  • 活动分组——无向图的连通分量个数

    一、相关概念 连通分量 无向图中,极大连通子图称为连通分量1)连通图的连通分量只有一个,即自身2)非连通的无向图有...

网友评论

      本文标题:无向连通图中“割边”、“关键桥”问题的Java实现

      本文链接:https://www.haomeiwen.com/subject/cdoqdqtx.html