通过深度优先搜索求强连通分量

本文介绍了如何使用深度优先搜索(DFS)算法求解图的强连通分量。首先,定义了节点的开始扫描时间d和结束扫描时间f。接着,通过对原图和转置图进行两次DFS,找出强连通分量。在原图中,从f值大的强连通分量指向小的;在转置图中,顺序相反。最后,给出了一段示例代码并证明了算法的正确性。
摘要由CSDN通过智能技术生成

基本定义:
图G(V,E)中,在深度搜索时为每一个节点记录两个时间戳,分别是开始扫描的时间d和将其所有子节点全部扫描完的时间f;
定义d(U)为节点集U中d的最小值,定义f(U)为节点集U中f的最大值。

基本步骤:
1.对图G进行深度优先搜索,记录每个节点的d,f;
2.求图G的转置Gt(所有节点不变,边的方向变反);
3.按照步骤一所求的节点的f,按照降序,对Gt进行深度优先搜索,得到的深度优先森林,森林中深度为1所形成的每个树,即为各个强连通分量

具体代码:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
/**
 * 
 * @author Founder
 * 通过深度优先搜索,查找强连通分量
 */
public class Main{
   
    static int time = 0; //时间戳
    static ArrayList<Integer> topology; //记录第一次搜索结果的拓扑排序
    public static void main(String[] args){
        /**
         * 输入方式:
         * 第一行输入节点的个数n
         * 后面n行输入第n个节点(从0开始数)链接的子节点,没有子节点则直接换行
         */
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        Node[] nodes = new Node[n];
        topology = new ArrayList<>();
        for(int i = 0; i < n; ++i){
            nodes[i] = new Node();
        }

        input.nextLine();

        for(int i = 0; i < n; ++i){
            String line = input.nextLine();
            if(!line.equals("")){
              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值