zoukankan      html  css  js  c++  java
  • 并查集问题

    1.朋友圈

    班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。

    给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。

    示例:

    输入: 
    [[1,1,0],
     [1,1,0],
     [0,0,1]]
    输出: 2 
    说明:已知学生0和学生1互为朋友,他们在一个朋友圈。
    第2个学生自己在一个朋友圈。所以返回2。

    思路:初始时给每一个对象都赋上不同的标签,然后对于属于同一类的对象,在root中查找其标签,如果不同,那么将其中一个对象的标签赋值给另一个对象,注意root数组中的数字跟数字的坐标是有很大关系的,root存的是属于同一组的另一个对象的坐标,这样通过getRoot函数可以使同一个组的对象返回相同的值。

    class Solution {
    public:
        int findCircleNum(vector<vector<int>>& M) {
            int n=M.size();
            int count=n;
            //初始化过程
            vector<int> root(n,0);//n个学生
            for(int i=0;i<n;i++)
            {
                root[i]=i;//每个节点的根节点都设置成自己
            }
            for(int i=0;i<n-1;i++)
                for(int j=i+1;j<n;j++)//这种遍历没有重复
                {
                    if(M[i][j])//两个人是朋友
                    {
                        int p=getRoot(root,i);
                        int q=getRoot(root,j);
                        if(p!=q){
                            root[p]=q;
                            count--;
                        }
                    }
                }
            return count;
        }
        
        int getRoot(vector<int>&root,int k){
            while(root[k]!=k){
                k=root[k];
            }
            return k;
        }
       
    };
  • 相关阅读:
    字符串转换整数 (atoi)
    Z 字形变换
    最长回文子串
    寻找两个有序数组的中位数
    二维码QRCode
    多个线程访问url
    store procedure 翻页
    store procedure example
    使用graphics2D给图片上画字符
    procedure的over(partition by ) function
  • 原文地址:https://www.cnblogs.com/inception6-lxc/p/9374870.html
Copyright © 2011-2022 走看看