zoukankan      html  css  js  c++  java
  • 算法——朋友圈(并查集)

    班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
    给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。
    链接: leetcode.

    解题思路:这是一个典型的并查集的问题,将朋友圈中,是朋友的人加入一个并查集。在初始情况下,所有人都不是朋友,则朋友圈的数量就是人的总数,每当检测到两个朋友不在一个并查集,那么就将其加入一个并查集,然后朋友圈的总数减一。

    class Solution {
        List<Integer> p = new ArrayList<>();
        public int findCircleNum(int[][] M) {
            int n = M.length;
            int res = n;
    
    
            for(int i = 0; i < n; i++){
                p.add(i);
            }
    
            for(int i = 1; i < n; i++) {
                for(int j = 0; j < i; j++) {
                    if(M[i][j] == 1) {
                        if(find(i) != find(j)) {
                            res --;
                            p.set(find(i), find(j));
                        }
                    }
                }
            }
    
            return res;
    
        }
    
        public int find(int x) {
            if(x != p.get(x)){
                p.set(x, find(p.get(x)));
            }
    
            return p.get(x);
        }
    }
    
  • 相关阅读:
    python端口扫描
    python模块-platform
    Mysql注入root权限直接写一句话马
    meterpreter使用
    msfpayload反弹shell
    sql_injection之post注入
    初涉sqlmap
    sql_injection之基本get注入
    利用SSLStrip截获https协议--抓取邮箱等密码
    简析CSRF
  • 原文地址:https://www.cnblogs.com/lippon/p/14117679.html
Copyright © 2011-2022 走看看