求解朋友关系中的朋友圈数量

问题描述:给出10w条人和人之间的朋友关系,求出这些朋友关系中有多少个朋友圈

样例A-B、B-C、D-E、E-F ,这四对关系中存在2个朋友圈

解题思路:并查集,而题目只需要求出朋友圈数量,并不需要求出各朋友圈,所以该并查集的实现也可以非常简单。

A-B,就把father[B] = A,处理每条朋友关系即可得到结果。

而关于并查集的介绍,已有很多博文有所阐述,这里就不啰嗦了。

如下给出实现的并查集

Python实现

class WeightedUF():
    fatherid=[]
    sz=[]
    count=0
    def __init__(self,n):
        self.count=n
        self.fatherid=[i for i in range(n)]
        self.sz=[0 for i in range(n)]
    def getcount(self):
        return self.count
    def connected(self,p,q):
        return self.find(p)==self.find(q)
    def find(self,p):
        while p !=self.fatherid[p]:
            p=self.fatherid[p]
        return p
    def pathcompressionfind(self,p):
        if p==self.fatherid[p]:
            return p
        else:
            self.fatherid[p]=self.pathcompressionfind(self.fatherid[p])
            return self.fatherid[p]
    def union(self,p,q):
        i=self.find(p)
        j=self.find(q)
        if i==j:
            return
        if self.sz[i]<self.sz[j]:
            self.fatherid[i]=j
            self.sz[j]+=self.sz[i]
        else:
            self.fatherid[j]=i
            self.sz[i]+=self.sz[j]
        self.count-=1  

Java实现

public class WeightUF {
    int[] fatherid ;
    int[] sz;
    int count = 0;
    public WeightUF(int n){
        this.count = n;
        this.fatherid = new int[n];
        this.sz = new int[n];
        for(int i=0;i<n;i++){
            fatherid[i] = i;
            sz[i] = 0;
        }
    }
    public int getCount(){
        return count;
    }
    public boolean connected(int p,int q){
        return find(p) == find(q);
    }
    public int find(int p){
        while (p != fatherid[p]){
            p = fatherid[p];
        }
        return p;
    }
    public int pathcompressionfind(int p){
        if(p == fatherid[p]){
            return p;
        }
        else{
            fatherid[p] = pathcompressionfind(p);
            return fatherid[p];
        }
    }
    public void union(int p,int q){
        int i = find(p);
        int j = find(q);
        if(i == j){
            return;
        }
        if(sz[i] < sz[j]){
            fatherid[i] = j;
            sz[j] += sz[i];
        }
        else{
            fatherid[j] = i;
            sz[i] += sz[j];
        }
        count -= 1;
    }
}

测试样例(java)

public static void main(String[] args) {
        WeightUF weightUF = new WeightUF(10);
        weightUF.union(9,2);
        weightUF.union(9,3);
        weightUF.union(1,2);
        weightUF.union(5,4);
        System.out.println(weightUF.getCount());
        System.out.println(weightUF.connected(9,4));
        System.out.println(weightUF.connected(9,5));
    }

时间: 2024-11-18 18:43:18

求解朋友关系中的朋友圈数量的相关文章

如何在App中实现朋友圈功能之五点赞、评论属性详细解析——箭扣科技Arrownock

如何在App中实现朋友圈功能 之五 点赞.评论属性详细解析 快速查看评论和点赞数量: 当我们创建一个墙贴后,这个墙贴会自动带有评论数量commentCount.赞数量likeCount.讨厌数量dislikeCount三个属性. 当有用户对这个墙贴进行了评论,该墙贴的commentCount属性会自动增长,无需开发者来手动操作实现. 如果用户建立的Like中like=true,那么likeCount会自动增长,反之,dislikeCount会自动增长. 如果用户把评论删除了,或者是把点赞撤销了,

如何在App中实现朋友圈功能之七快速实现上拉加载朋友圈功能——箭扣科技Arrownock

如何在App中实现朋友圈功能 之七 快速实现上拉加载朋友圈功能 逻辑分析: 取出缓存postList里的最后一条数据postList a. 如果lastPost存在,说明缓存里有数据,接着取出数据库中与lastPost时间最接近的一条latestPost,以它们的created_at作为关键查询条件,去服务器取limit条(比如10)数据: 1. 如果服务器返回的Post数量大于0,将Post存入数据库,之后需要做两个查询动作: 查询出新的Like和Comment:根据本地数据库里的最新一条Li

如何在App中实现朋友圈功能之一朋友圈实现原理浅析——箭扣科技Arrownock

如何在App中实现朋友圈功能 之一 朋友圈实现原理浅析 微信朋友圈.新浪微博.知乎等知名朋友圈类型功能,大家有没有想过其实现的逻辑呢? 本文以微信朋友圈功能为例,解析实现逻辑. 朋友圈的结构: 朋友圈从总体上来说会分为6块结构,分别是墙.用户.图片.墙贴.评论与点赞. 墙:一块公共的墙,所有的墙贴都位于其上,如果APP只实现朋友圈功能,那么墙贴其实是可以不用的,但是如果APP要实现朋友圈.新闻圈等等其他各种墙贴类型消息的话,那么墙就显得很有必要了,这时候我们需要通过建立不同的墙来展示不同类型的墙

如何在App中实现朋友圈功能之二快速实现用户信息的自定义——箭扣科技Arrownock

如何在App中实现朋友圈功能 之二 快速实现用户信息的自定义 自我关联社交元素: anSocial中很多的社交元素API,如帖子(Post).相册(Album).文件(File)等,这些API的可选参数中允许传入其他社交元素的id. 当我们传了这些id时,服务器数据库里保存的是id,但是在返回结果里,会将这些id以对象的形式返回. 这样就大大提升了查询效率,原本需要查询两次的功能,现在可以一次实现,比如接下来要说的用户头像功能开发里可以利用的字段. 用户头像: 当我们在APP上创建用户,需要调用

如何在App中实现朋友圈功能之三快速实现双向好友功能——箭扣科技Arrownock

如何在App中实现朋友圈功能 之三 快速实现双向好友功能 在社交APP的使用中,用户相互添加好友是一个必要的场景,本期技术分享在这里给大家介绍如何利用AnSocial的Friend来实现微博粉丝和微信好友机制. 微博粉丝机制: 微博是一个单向的好友关系链,从单个用户出发,他拥有关注者和粉丝.利用Friend可以实现以下场景:用户A关注了B,用户C关注了A,即B拥有粉丝A,A拥有粉丝C. 具体实现方式: 用户A关注B,调用新建Friend(friends/add.json),参数中target_f

在中国,父母和孩子不可能成为朋友关系。

发表于:2015-04-03 19:47:18   也许我都还是个小孩还没有资格谈论大人和小孩之间的关系,但是这是我生命中看了某些事而受到了启发,所以我必须把他写下来,将来到某一天我有孩子了,回过头来看看当时自己的看法,我是决对的相信人在不同的时候看一件事是有不同的感想和观点的,就拿一部电影来说吧,小时候我们看的时候就是娱乐,可当我们长大后再看那些曾经我们看过的时候有些场景我们不会觉得好笑了,甚至会哭,这是因为我们在不同的成长时期经历了许多事,当再面对某件事的时候我们就会有切身的感受.现在就来说

P1111 朋友关系判定

题目描述 有n个人和m对关系,这n个人的编号从1到n. 而m对关系中,每对关系都包含两个人的编号A和B(1<=A,B<=n),用于表示A和B是好友关系. 如果两个数A和B不在好友关系中,则A和B不是好友. 你需要保证:如果对于任意的A.B.C,如果A和B是好友,且B和C是好友,则A和C必须是好友. 如果这个条件能够得到保证,则输出"YES",否则,输出"NO". 换句话说,如果存在A,B,C三个人,其中A和B是好友,B和C是好友,但是A和C不是好友,就输

(hdu step 5.1.3)Segment set(求与一条线段相交的线段集合中的线段的数量)

题目: Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 177 Accepted Submission(s): 82   Problem Description A segment and all segments which are connected with it compose a segment set. T

[算法导论]练习2-4.d求排列中逆序对的数量

题目:给出一个确定在n个不同元素的任何排列中逆序对数量的算法,最坏情况需要Θ(nlgn)时间.(提示:修改归并排序.) 思路:修改从大到小排序的归并排序. 归并排序分为三步:分解.解决.合并. 分解:将排列A分解为A1.A2两个子排列. 解决:递归的从大到小排列A1和A2,在此同样递归的求解A1.A2的逆序对数量. 合并:按照递归排序的合并策略从大到小比较A1中的元素[a1,a2,a3…]和A2中的元素[b1,b2,b3…]. 1.若a1大于b1,则a1大于A2中的所有元素,逆序对的数量加上le