并查集初学(2)LA 3644 & LA3027
2016-05-08 09:15
369 查看
1、LA 3644题目:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=12648并查集入门题,寻找是否存在环,若存在,则cnt++
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> const int maxn=100010; using namespace std; int p[maxn]; //带路径压缩的并查集 int Find(int x){return p[x] == x?x:p[x]=Find(p[x]);} int main() { int x,y; while (scanf("%d",&x) == 1) { for (int i=0;i<maxn;i++) p[i]=i; int cnt=0; while (x != -1) { scanf("%d",&y); x=Find(x); y=Find(y); if (x == y) cnt++; else p[x]=y; scanf("%d",&x); } printf("%d\n",cnt); } return 0; }2、LA 3027题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33982分析:一边路径压缩,一边维护d[i] : 结点i到树根的距离
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn=20010;int p[maxn];int d[maxn];int Find(int x){if (p[x] != x){int root=Find(p[x]);d[x] += d[p[x]];return p[x]=root;}else return x;}int main(){int T;scanf("%d",&T);while (T--){int n,u,v;char cmd[9];scanf("%d",&n);for (int i=1;i<=n;i++){p[i]=i;d[i]=0;}while (scanf("%s",cmd) && cmd[0] != 'O'){if (cmd[0] == 'I'){scanf("%d%d",&u,&v);p[u]=v;d[u]=abs(u-v) % 1000;}if (cmd[0] == 'E'){scanf("%d",&u);int t=Find(u);printf("%d\n",d[u]);}}}return 0;}
相关文章推荐
- Box2d资料整理与收集
- 第五章:系统服务
- Box2D物理引擎模拟炸弹爆炸效果
- jvm类加载器和双亲委派模型
- nginx日志文件切割
- 电脑之间用网线直接连接起来快速传送大文件技巧
- 40个良好用户界面设计Tips
- 奇奇怪怪的树形dp
- 桌面图标没有是解决方法windown
- Android5.1系统WebView内存泄漏场景
- android使用shader进行渲染
- nginx启动脚本
- [置顶] 对优秀程序员的思考
- 二叉树的遍历--递归及非递归实现
- 第四章:用户和组管理
- 3D 游戏控制
- nginx
- paoracle中的包头(Package)与包体(Package body)
- Hash Compared & ELFHash 详解
- map同步数据库/后台缓存