Poj(1703),种类并查集
2024-10-19 11:52:50
题目链接:http://poj.org/problem?id=1703
已经不是第一次接触种类并查集了,直到今天才搞懂。
感谢红黑联盟,感谢杰哥!!!
每个节点只要关系确定,不管是不是同一个集合里面,都把他们放到一个集合里面,用一个rank[]数组记录他们与根节点的关系,比较神奇的地方有两处:
1、find函数里面,因为find是递归写的,不断往上找,不断更新rank[x](与根节点的关系),这个%k,也是很牛逼的,2种类型,标号只有01;
2、Union函数里面,更新rank[fy],rank[y]这里是(rank[x] - rank[y] +T)%2,这里特值法证明一下吧,我智商已经不够用了,比如说,新的节点0,合并后,就往上找,比如说找到了110,这个点肯定不是跟根同一个集合,0-A,0-B,然后(0-0+1)%2==1;
啊哈,特例搞一下吧,脑容量不够了。
#include<cstdio> const int N = ;
int n, m, f[N], rank[N]; void init()
{
for(int i=; i<=n; ++i)
f[i]=i,rank[i]=;
} int find(int x)
{
if(x==f[x])
return f[x];
int fa=f[x];
f[x] = find(f[x]);
rank[x] = (rank[x]+rank[fa])%;
return f[x];
} bool Union(int x,int y)
{
int fx=find(x), fy=find(y);
if(fx==fy) return false;
f[fy] = fx;
rank[fy] = (rank[x]-rank[y]+)%;
} int main()
{
int T,a,b,fa,fb;
char ch;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%*c",&n,&m);
init();
for(int i=; i<m; ++i)
{
scanf("%c%d%d%*c",&ch,&a,&b);
if(ch=='D')
{
Union(a,b);
}
else
{
fa = find(a), fb=find(b);
if(fa==fb)
{
if(rank[a]==rank[b]) puts("In the same gang.");
else puts("In different gangs.");
}
else
puts("Not sure yet.");
}
}
}
return ;
}
最新文章
- WPF实现炫酷Loading控件
- linux 下配置 nodejs+ionic+cordova
- JSP 动作元素
- Android ListView无法触发ItemClick事件
- 解决eclipse打开报错:failed to create the java virtual ma
- SurfaceView的一个小应用:开发示波器
- UDP(socket)数据访问和封装情况C++代码
- Java之旅(三)--- JSTL和EL表情
- 前端学习——ionic/AngularJs——获取验证码倒计时按钮
- Web office apps 安装部署
- UbuntuNFS服务器配置
- 试着简单易懂记录synchronized this object Class的区别,模拟ConcurrentHashMap
- Dubbo框架应用之(一)--服务体系
- 微信网页浏览器打开链接后跳转到其他浏览器下载APK文件包
- easyui的下拉框combox动态复赋值显示在前端
- Kubernetes 笔记 02 demo 初体验
- 学号 20175223 《Java程序设计》第2周学习总结
- 【树状数组套主席树】带修改区间K大数
- Assert.IsNotNull 方法(判断对象不为NULL)
- Oracle增加一列、修改一列数据类型
热门文章
- python进制转换或数据格式转换
- oracle命令查看表结构及表索引
- gcc 4.9编译
- 【转】java序列化技术
- java实现两个整数相除保留一位小数
- dt4.0上传图片总是压缩解决办法,为什么我设置了不压缩图片,程序还是压缩呢?
- [LeetCode]19. Remove Nth Node From End of List删除链表的倒数第N个节点
- Redis整理第二波(启动、命令)
- Python并发编程之进程池与线程池
- 解决 Maven 项目中找不到 jdk 的 tools.jar 文件的办法(多数情况下适用)