首页 > 其他分享 >并查集——传新闻

并查集——传新闻

时间:2023-07-02 16:22:32浏览次数:37  
标签:朋友 新闻 查集 用户 int MAXN

并查集——传新闻

在社交网络中,有 n 个用户在 m 个朋友群中相互交流。我们来分析一下在用户之间传播一些新闻的过程。

最初,某个编号为 x 的用户收到新闻,随后他将新闻发送给他的朋友(如果两个人同属于一个或多个朋友群,则两者便是朋友)。而朋友们继续向他们的朋友发送新闻,以此类推,直至所有人都将新闻告诉了他们的朋友。

对于每个编号为 x 的用户,若最初只有用户 x 开始传播新闻,那么最终知道该新闻的用户数量是多少。

Input

第一行包含两个整数 n, m( 1 ≤ n, m ≤ 5*10^5 ),分别表示用户和朋友群的数量。

接着是 m 行朋友群的用户情况,第 m_i 行的第1个整数 k 表明该朋友群的用户数量,接下来的 k 个整数表明属于第 m_i 朋友圈的用户编号。

数据量较大,请使用scanf和printf。

Output

输出 n 个整数,表明第 n_i 个用户作为新闻传播者所能传播多少人。

Example

Input

7 5

3 2 5 4

0

2 1 2

1 1

2 6 7

Output

4 4 1 4 4 2 2

代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 500010
int fa[MAXN],d[MAXN];
void init(int n){
	for(int i=1;i<=n;i++){
		fa[i] = i;
		d[i]=0; 	}
}
int find(int x){
	if(x == fa[x])
		return x;
	else{
		fa[x] = find(fa[x]);
		return fa[x];
	}
}
void unionn(int i,int j){
	int i_fa = find(i);
	int j_fa = find(j);
	if(i_fa==j_fa) return;
	if(d[i_fa]<d[j_fa]) fa[i_fa]=j_fa;//如果后者比前者深,则前者拥有后者所有
	else{
		fa[j_fa]=i_fa;
		if(d[i_fa]==d[j_fa]) d[i_fa]++;//如果一样深,则前者比后者深度多加一个点
	}
}
int n,m,k,m_1,m_i,n_i[MAXN],ans;
int main(){
	scanf("%d""%d",&n,&m);
	init(n);
	while(m--){
		scanf("%d",&k);
		if(!k) continue;
		scanf("%d",&m_1);
		for(int i=1;i<k;i++){ 
			scanf("%d",&m_i);
			unionn(m_1,m_i);
		}					
	}
	for(int i=1;i<=n;i++){
		n_i[find(i)]++;
	} 
	for(int i=1;i<=n;i++){
		printf("%d ",n_i[find(i)]);
	}
	return 0;
}

此题是在正常并查集的每一个结点上求出最深深度,也就是每个结点存储的不再是祖节点,而是祖结点的深度,始化多了一个d[n]数组,在添加节点的时候再具体判断情况。

标签:朋友,新闻,查集,用户,int,MAXN
From: https://www.cnblogs.com/bzlx1717/p/17520916.html

相关文章

  • [数据结构]笛卡尔树、ST表、带权并查集
    Cartesiantree(笛卡尔树)1.概念比如拿最小的当根建树,中序遍历是原数组2.性质区间最小值(RMQ),LCA的值,比如上图4和6的LCA是2,表示我们4,6,2这个区间里面的最小值是2找y左边第一个<=y的数就是y往上看第一个向左拐的数3.构造(增量法)对每个前缀考虑我们发现只有右链是......
  • NC235745 拆路 (并查集)
    https://ac.nowcoder.com/acm/problem/235745点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intfa[N],cnt[N],st[N],en[N],a[N],b[N],ans[N];set<pair<int,int>>t;intfind(inti){if(fa[i]==i)returni;......
  • 并查集
    publicclassUnionFind{//i的根节点时root[i]privateint[]root;publicUnionFind(intsize){root=newint[size];for(inti=0;i<size;i++){root[i]=i;}}publicvoidUnion(in......
  • 并查集的具体应用 CF1213G CF444E [HNOI2005]狡猾的商人
    每当我们看到“最大值最小”“路径上的最大最小值”等字眼时,我们就可以考虑并查集。我们可以尝试把这些问题转化为某种意义上按单调顺序的合并,利用并查集求解答案。以下时两例并查集的巧妙应用。CF1213GPathQueries注意“最大权值不大于q”,加上允许离线,我们可以把边按照权值......
  • ORACLE 新闻速递 ORACLE 23C 免费提供给开发者 为什么???
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。以下是新闻速递分析师们表示,Oracle推出新的面向开发人员版本数据库的策略变化,与该公司计划捍卫其市场主导地位和寻求采用创新方式......
  • PostgreSQL 新闻速递 谷歌基于POSTGRESQL 兼容数据库提供更大规模的数据库服务
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。谷歌正在将针对PostgreSQL的AlloyDB数据库服务扩展至16个新区域。AlloyDB是一个兼容PostgreSQL的托管数据库服务,于去年......
  • abc049d <并查集>
    https://atcoder.jp/contests/abc049/tasks/arc065_b//https://atcoder.jp/contests/abc049/tasks/arc065_b//使用两个并查集维护连通关系//求并集,使用每个并查集的祖宗节点组成的pair表示这个交集#include<iostream>#include<algorithm>#include<map>usingnames......
  • 数据库新闻速递 明白3中主流的数据迁移方法 (译)
    头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系liuaustin3,在新加的朋友会分到2群(共830人左右1+2)基于应用程序的、基于文件的和基于块的迁移都有各自的优点和适用场......
  • 并查集
    并查集模板: #include<bits/stdc++.h>#defineMaxsize100005//只需要改这里就可以usingnamespacestd;intfa[Maxsize],rankk[Maxsize];inlinevoidinit(intn)//初始化{for(inti=1;i<=n;++i){fa[i]=i;rankk[i]=1;}}intfind(intx)/......
  • HDU 3277 Marriage Match III(并查集+二分+最大流)
    题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢?一开始我想每个女孩连喜欢的男孩,而且选K个不喜欢的男孩也连边,可是这K个要怎么确定呢?这种显然......