
Codeforces 1167C-News Distribution【并查集】【模版】
发布日期:2021-05-04 18:31:15
浏览次数:21
分类:技术文章
本文共 1085 字,大约阅读时间需要 3 分钟。
题意
总共n个人,有m组(一个人可能在多个组里,也可能一个都不在),如果一个知道新闻就会告诉他所在的组里的人,然后组里的其他人继续传播;任务是假设第i个人知道新闻,问最终多少人知道新闻(输出n个整数(i从1~n))
思路
这题明显用并查集,然后用个数组记录人数,不过我是直接用set把数塞进去,输出大小,注意最后要在从1~n跑一遍find把根节点统一了才能开始塞数进set
贴个并查集代码并查集
int find(int k){ if(r[k] == k) return k; return r[k] = find(r[k]);}void merge(int a, int b){ int fa = find(a); int fb = find(b); if(fa != fb) r[fb] = fa;}
代码
#includeusing namespace std;typedef long long ll;int r[500100];set s[500100];int find(int k){ if(r[k] == k) return k; return r[k] = find(r[k]);}void merge(int a, int b){ int fa = find(a); int fb = find(b); if(fa != fb) r[fb] = fa;}int main(){ int n, m; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++){ r[i] = i; } while(m--){ int t, temp, pos; scanf("%d", &t); for(int i = 0; i < t; i++){ scanf("%d", &temp); if(i == 0){ pos = temp; } else{ merge(pos, temp); } } } for(int i = 1; i <= n; i++){ find(i); } for(int i = 1; i <= n; i++){ s[r[i]].insert(i); } for(int i = 1; i <= n; i++){ cout << s[r[i]].size() << " "; } cout << endl;}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年03月28日 22时38分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
结构化方法
2019-03-03
无线网络技术
2019-03-03
项目预算的组成
2019-03-03
帕累托图
2019-03-03
Dockerfile构建Python3.5环境---亲测可行代码
2019-03-03
LaTex 自动生成IEEE格式的参考文献
2019-03-03
编写测试用例的实用小技巧
2019-03-03
c语言贪吃蛇控制台版
2019-03-03
Windows10 下springboot应用无法被外部网络访问
2019-03-03
1.Redis(缓存数据库)系列之认识redis缓存【穿透、击穿、雪崩】
2019-03-03
对象和封装
2019-03-03
同时在写四门编程语言是怎样一种体验?
2019-03-03
【背包dp】P5020 货币系统
2019-03-03
【树形dp】P1273 有线电视网
2019-03-03
【分层图最短路】P4568 [JLOI2011]飞行路线
2019-03-03
【最短路】P4408 [NOI2003]逃学的小孩
2019-03-03
回文自动机
2019-03-03