博客
关于我
并查集 + map (集合里元素的个数)
阅读量:293 次
发布时间:2019-03-03

本文共 1178 字,大约阅读时间需要 3 分钟。

ac代码:
因为输入的数据可能比较接近int最大值的一半,所以不能直接把输入的数据直接合并。
由题可知,我们只需要知道最大的一个集合元素的个数,n最大1e5,所以我们的思路就是对于每一个新的数据,都一对一映射成一个小数据,这样就能用并查集了。

#include 
using namespace std;const int N = 3e5 + 9;typedef long long ll;unordered_map
m;ll cnt;ll n, t;ll ans[N];struct xxxx{ ll x; ll sum;}bcj[N];ll Find(ll x){ ll r = x, j, k = x; while(bcj[r].x != r) r = bcj[r].x; while(k != r) { j = bcj[k].x; bcj[k].x = r; k = j; } return r;}void Union(ll a,ll b){ a = Find(a); b = Find(b); if(a != b)// 根节点不同才加到另一个集合 { bcj[b].x = a; bcj[a].sum += bcj[b].sum; // 因为是把a当根节点,所以一定要把 b 的加到 a 里面 !!! // 不能加反了!!! }}int main(){ cin >> t; while(t--) { cin >> n; cnt = 0; m.clear(); memset(ans,0,sizeof(ans)); for(ll i = 1; i <= N-9; ++i) bcj[i].x = i, bcj[i].sum = 1; ll a, b; for(ll i = 1; i <= n; ++i) { scanf("%lld %lld", &a, &b); if(m[a] == NULL) m[a] = ++cnt; a = m[a]; if(m[b] == NULL) m[b] = ++cnt; b = m[b]; Union(a, b); } for(ll i = 1; i <= cnt; ++i) Find(i); ll Max = 0; ll ttt = 0; for(int i = 1; i <= cnt; ++i) { ans[bcj[i].x]++; //cout << bcj[i].sum << " " << bcj[i].x <

转载地址:http://pwfm.baihongyu.com/

你可能感兴趣的文章
21.2.3总结
查看>>
赠书和投票 | 你知道中国有哪些Server SAN厂商吗? 投票:你心目最好的HCI品牌是?
查看>>
方法的绑定机制-静态绑定和动态绑定
查看>>
Java取绝对值
查看>>
for循环读取数组遇问题:dexError: invalid index to scalar variable.
查看>>
编写测试用例的实用小技巧
查看>>
c语言贪吃蛇控制台版
查看>>
报错:在IDEA中springboot项目操作数据库,配置文件驱动com.mysql.cj.jdbc.Driver标红
查看>>
redis报错(error) NOAUTH Authentication required.解决办法
查看>>
【树形dp】P1273 有线电视网
查看>>
【最短路】P4408 [NOI2003]逃学的小孩
查看>>
2020电工(初级)考试及电工(初级)考试软件
查看>>
2020N1叉车司机模拟考试题库及N1叉车司机复审模拟考试
查看>>
2020年制冷与空调设备运行操作答案解析及制冷与空调设备运行操作考试总结
查看>>
2020年保育员(初级)考试资料及保育员(初级)新版试题
查看>>
2020年茶艺师(高级)考试内容及茶艺师(高级)考试申请表
查看>>
2021年重氮化工艺考试题库及重氮化工艺考试报名
查看>>
2021年车工(高级)考试总结及车工(高级)试题及答案
查看>>
2021年压力焊证考试及压力焊实操考试视频
查看>>
2021年低压电工考试及低压电工考试申请表
查看>>