算法 4.2节 有向图中环的判定以及Kosaraju算法实现强连通分量

//有向图判定
import java.util.Stack;

public class DirectedCircle {
    private boolean[] marked;
    private boolean[] onStack;
    private int[] edgeTo;
    private Stack<Integer> circle;

    public DirectedCircle(Graph G) {
        marked = new boolean[G.V()];
        onStack = new boolean[G.V()];
        edgeTo = new int[G.V()];
        for (int i = 0; i< G.V(); i++) {
            if (!marked[i]) {
                dfs(G, i);
            }
        }
    }

    private void dfs(Graph G, int v) {
        onStack[v] = true;
        marked[v] = true;
        for (int w : G.adj(v)) {
            if (this.hasCircle()) return;
            else if (!marked[w]) {
                edgeTo[w] = v;
                dfs(G, w);
            } else if (onStack[w]) {
                circle = new Stack<>();
                for (int i = v; i != w; i = edgeTo[v]) {
                    circle.push(i);
                }
                circle.push(w);
                circle.push(v);
            }
        }
        onStack[v] = false;
    }

    public Iterable<Integer> circle() {
        return circle;
    }

    private boolean hasCircle() {
        return circle != null;
    }
}
//拓扑排序
import java.util.Stack;

public class DFSorder {
    private Stack<Integer> reversePost;
    private boolean[] marked;

    public DFSorder(Graph G) {
        reversePost = new Stack<>();
        marked = new boolean[G.V()];
        for (int v = 0; v < G.V(); v++) {
            dfs(G, v);
        }
    }

    private void dfs(Graph G, int v) {
        marked[v] = true;
        for (int w; G.adj(v)) {
            if (!marked[w]) {
                dfs(G, w);

            }
        }
        reversePost.push(v);
    }

    public Iterable<Integer> reversePost() {
        return reversePost;
    }

}
//Kosaraju算法实现强连通分量

public class KosarajuSharirSCC {
    private int[] id;
    private int count;
    private boolean[] marked;

    public KosarajuSharirSCC(Graph G) {
        marked = new boolean[G.V()];
        id = new int[G.V()];
        DFSorder order = new DFSorder(G);
        for (int s : order.reversePost()) {
            if (!isMarked(s)) {
                dfs(G,s);
                count++;
            }
        }
    }

    private void dfs(Graph G, int  s) {
        marked[s] =true;
        id[s] = count;
        for (int w : G.adj(s)) {
            if (!isMarked(w)) {
                dfs(w);
            }
        }
    }

    private boolean isMarked(int v) {
        return marked[v];
    }

    public int id(int v) {
        return id[v];
    }

    public boolean isConnected(int w, int v) {
        return id[v] == id[w];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值