LeetCode基础-图-连通分量

在无向图G中,若从顶点 v 到顶点 w 有路径(当然从vj到vi也一定有路径),则称v和 w 是连通的。
若图 G 中任意两个不同的顶点 v 和 w 都连通(即有路径),则称G为连通图。
无向图 G 的极大连通子图称为 G 的最强连通分量。

  • 任何连通图的连通分量只有一个,即是其自身。
  • 非连通的无向图有多个连通分量。

可以用 DFS 查找所有连通分量:

class CC {
    private boolean[] marked;   // 标记 marked[v]
    private int[] id;           // id[v] 即连通分量的id
    private int[] size;         // size[id] 即连通分量中的顶点数量
    private int count;          // 连通分量的数量
    public CC(Graph G) 
    {
        marked = new boolean[G.V()];
        id = new int[G.V()];
        size = new int[G.V()];
        for (int v = 0; v < G.V(); v++) 
        {
            if (!marked[v]) 
            {
                dfs(G, v);
                count++;
            }
    }
    private void dfs(Graph G, int v) {
        marked[v] = true;
        id[v] = count;
        size[count]++;
        for (int w : G.adj(v)) {
            if (!marked[w]) {
                dfs(G, w);
            }
        }
    }
    public boolean connected(int v, int w) {
        return id(v) == id(w);
    }
    public int id(int v) {
        return id[v];
    }

图解流程如下:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值