DisJSet:Find them, Catch them(POJ 1703)
2015-11-04 00:34
671 查看
抓住他们!
题目大意:两个黑社会帮派,互相打架,现在你很多条信息,要你确定两个人是否属于不同帮派
这题很有趣,题目不是直接给你两个人是否是一个帮派的,他给你的是不同帮派的,也就是给你很多个不同的要你找相同的。
乍看很麻烦,但是还记得我以前发布过一个食物链的题解吗!
食物链要求维护三个不同关系的集合,我第二种方法用的是偏移集!只用两个集合就搞定问题了。
这一题比食物链更简单,他只用维护两个就可以了。
#include <iostream> #include <functional> #include <algorithm> #define MAX 100005 using namespace std; typedef int Position; static int Set[MAX]; static int delta[MAX]; Position Find(Position); void Unite_Set(Position, Position); void Test(Position, Position); int main(void) { int case_sum, n, message_sum, tmp_x, tmp_y; char choice; scanf("%d", &case_sum); while (case_sum--) { scanf("%d%d", &n, &message_sum); getchar(); for (int i = 1; i <= n; i++) Set[i] = i; memset(delta, 0, sizeof(delta)); for (int i = 0; i < message_sum; i++) { scanf("%c", &choice); scanf("%d%d", &tmp_x, &tmp_y); if (choice == 'D') Unite_Set(tmp_x, tmp_y); else Test(tmp_x, tmp_y); getchar();//消除回车 } } return 0; } void Test(Position x, Position y) { Position px, py; px = Find(x); py = Find(y); if (px == py) { if ((delta[x] - delta[y] + 2) % 2 == 0) puts("In the same gang."); else puts("In different gangs."); return ; } puts("Not sure yet."); } Position Find(Position x) { Position tmp; if (Set[x] == x) return x; tmp = Find(Set[x]); delta[x] = (delta[x] + delta[Set[x]]) % 2; Set[x] = tmp; return tmp; } void Unite_Set(Position x, Position y) { Position px, py; px = Find(x); py = Find(y); if (px != py) { Set[py] = px; delta[py] = (delta[x] - delta[y] + 1 + 2) % 2; } }
相关文章推荐
- JSP中内建exception对象时出现500错误的解决方法
- jsp编程中session的用法实例分析
- Js插件ECharts,HighCharts学习网址整理
- JavaScript前端开发之实现二进制读写操作
- JS实现网页上随滚动条滚动的层效果代码
- JS实现超精简的链接列表在固定区域内滚动效果代码
- JS实现获取键盘按下的按键并显示在页面上的方法
- 【D3.js数据可视化实战】--(3)桑基图(sankey)的绘制
- 解决js图片加载时出现404的问题
- js数组去重的5种算法实现
- 基于JavaScript实现移动端点击图片查看大图点击大图隐藏
- javascript常用函数(1)
- 使用JavaScript和CSS实现文本隔行换色的方法
- JSON文件编辑
- json-lib的maven配备
- js中的拷贝和引用以及ES6大法好
- 生成JSON字符串
- Javascript 异步加载详解
- 深入浅出 JavaScript 中的 this
- js中的一些消息提示框