朋友圈(使用并查集)的实现

#pragma once

#include<iostream>

using namespace std;

class UnionFindSet

{

public:

UnionFindSet(int n)

{

_n = n + 1;

_set = new int[_n];

for (int i = 1; i < _n; ++i)

{

_set[i] = -1;

}

}

int GetFriendSet(int n, int m, int r[][2])

{

for (int i = 0; i < m; ++i)

{

UnionfriendSet(r[i][0],r[i][1] );

}

int count = 0;

for (int i = 1; i < _n; ++i)

{

if (_set[i] <0)

++count;

}

return count;

}

void UnionfriendSet(int n,int m)

{

int root1 = GetRoot(n);

int root2 = GetRoot(m);

if (root1 != root2)

{

_set[root1] += _set[root2];

_set[root2] = root1;

}

}

int GetRoot(int x)

{

while (_set[x] >= 0)

{

x = _set[x];

}

return x;

}

protected:

int *_set;

size_t _n;

};

时间: 2024-11-08 08:40:35

朋友圈(使用并查集)的实现的相关文章

HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示编号为c的女生和编号为d的女生是朋友 6 // 7 //进行配对的要求满足其一即可. 8 //1.a女生没有和b男生吵过架 9 //2.a女生的朋友和b男生没有吵过架 10 // 11 //每进行一轮之后重新配对,配过得一对不可再配,问最多能进行几轮. 12 // 13 //题解: 14 //这一道

7-25 朋友圈(25 分)(并查集的应用)

某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友"这个推论可以得出,如果A和B是朋友,且B和C是朋友,则A和C也是朋友.请编写程序计算最大朋友圈中有多少人. 输入格式: 输入的第一行包含两个正整数N(≤30000)和M(≤1000),分别代表学校的学生总数和俱乐部的个数.后面的M行每行按以下格式给出1个俱乐部的信息,其中学生从1~N编号: 第i个俱乐部的人数Mi(空格)学

swust oj 1091--土豪我们做朋友吧(并查集,最值维护)

题目链接:http://acm.swust.edu.cn/problem/1091/ Time limit(ms): 1000 Memory limit(kb): 32768 人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情.有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个种类,1:A和B成为了朋友,并且A的所有朋友都成了B的朋友,B的所有朋友也都成了A的朋友.2:A缺钱了,请求帮助,他需要向他朋友中钱最多的请求帮助,若不止一位,选择编

并查集详解(转)

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修

并查集的应用

定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 应用 若某个朋友圈过于庞大,要判断两个人是否是在一个朋友圈,确实还很不容易,给出某个朋友关系图,求任意给出的两个人是否在一个朋友圈. 规定:x和y是朋友,y和z是朋友,那么x和z在一个朋友圈.如果x,y是朋友,那么x的朋友都与y的在一个朋友圈,y的朋友也都与x在一个朋友圈. 如下图: 代码: //找朋友圈个数 //找父亲节点 int FindRoot(int chi

并查集详解(转自一个很有才的大神)膜拜

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修

并查集基础 模板题 hdu1232 畅通工程

模板题 引入并查集——一则有趣的故事 为了解释并查集的原理,我将举一个更有趣的例子.话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架.但大侠们有一个优点就是讲义气,绝对不打自己的朋友.而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人.这样一来,江湖上就形成了一个一个的群落,通过两两之间的朋友关系串联起来.而不在同一个群落的人,无论如何都无法通过朋友关系连起

UVA 10608 Friends 并查集

并查集水题 有n个人,m队朋友,朋友的朋友,也是朋友,A与B是朋友,B与C是朋友,那么A与C也是朋友,即A,B,C在同一个并查集里,合并即可: 最后会有几个"朋友圈子",求最大的朋友圈的人数. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int r[30005]; int x[30010]; i

零基础学并查集算法

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修

题目1526:朋友圈

时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1675 解决:514 题目描述: 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈.假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1.2.3属于一个朋友圈,4.5属于另一个朋友圈,结果为2个朋友圈.