leetcode1319. 连通网络的操作次数

链接:
https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/

题目描述:
用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。
网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。
给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。

dfs求联通分量数,联通分量数-1即为最少操作次数。代码如下。

public class Problem1319 {

    List<Integer>[] edges; //存边
    boolean[] vis; //记录节点是否访问过
    public int makeConnected(int n, int[][] connections) {
        //n个点至少n-1条边才可实现联通
        if (connections.length<n-1)
            return -1;
        edges=new List[n];
        vis=new boolean[n];

        for (int i = 0; i < n; i++) {
            edges[i]=new ArrayList<>();
        }
        //建边
        for (int[] item : connections){
            edges[item[0]].add(item[1]);
            edges[item[1]].add(item[0]);
        }

        int ans=0;
        for (int i = 0; i < n; i++) {
            if (!vis[i]){
                dfs(i);
                ans++;
            }
        }
        return ans-1;
    }

    public void dfs(int u){
        vis[u]=true;
        for (int v:edges[u]){
            if (!vis[v])
                dfs(v);
        }
    }

}

题解还有一种并查集解法,有时间来写~

posted @ 2021-01-23 21:22  withwind777  阅读(72)  评论(0)    收藏  举报