并查集笔试题
2016-08-16 11:26
155 查看
/* 2016-8-16 Definition Created by taotao man on 2016-8-16 breif: 经过深思熟虑之后,小贱君打算去M国闯一闯,那是一个古老的东方国度,传说有很多高阶魔法师,他想成为一名伟大的魔法师,将来征服星辰大海。 经过千辛万苦,小贱君终于来到了M国,不幸的是刚进城门小贱君就被M国的守城士兵困在了一种叫做“困兽之斗”的阵法之中。 士兵对小贱君说:“看到漂浮在你身边的宝石了吗?彩虹连接的两颗宝石可以任意交换位置,你需要通过一系列交换后使得宝石组成的字符串的字典序最小。若不能破阵,那还是请回吧!” 小贱君观察了一下周围的宝石,只见每颗宝石上标有一个小写字母,而且有一些宝石上通过彩虹与其他宝石相连。 琢磨了半天,他终于搞懂了这个阵法的意思: 若宝石系列为:dcba 其中有两道彩虹,分别是(0,1),(1,2),代表第一个位置上的宝石可以和第二个位置上的宝石互换,第二个位置上的宝石可以和第三个位置上的宝石互换,最终可以得到字典序最小的宝石系列:bcda。 作为小贱君的死党,你有什么方法帮助他破阵吗? 输入描述: 输入包含多组测试数据。 对于每组测试数据: 字符串s --- 代表宝石序列 n --- 代表有n条彩虹 接下来n行,每行两个数ai,bi --- 表示ai和bi由一条彩虹相连。 保证: 1<=s的长度<=10000 1<=n<=10000 且输入数据均合法。 //修改记录 date: Add SetA(); Change GetA(); 并查集 http://blog.csdn.net/taotaoah/article/details/52215306 */ #include<iostream> #include<string> using namespace std; int p[10001]; //记录每个前导点是什么 // 查找根节点 路径压缩 int Find(int x) { int y = p[x]; while (y != p[y]) y = p[y]; p[x] = y; return y; } int main() { string m_GamSeries; cout << "请输入宝石系列gemstone_series:"; while (cin >> m_GamSeries) { int n; cout << "请输入彩虹岛道数n:"; cin >> n; int len = m_GamSeries.size(); for (int i = 0; i < len; i++) p[i] = i; for (int i = 0; i < n; i++) { int x, y; cin >> x >> y; cout << "彩虹分别是:" << i + 1 << "<" << x << "," << y << ">" << endl; int a = Find(x); int b = Find(y); if (a < b) p[b] = a; else p[a] = b; } for (int i = 0; i < len; i++) for (int j = i + 1; j < len; j++) if (Find(i) == Find(j) && m_GamSeries[i] > m_GamSeries[j]) swap(m_GamSeries[i], m_GamSeries[j]); cout << m_GamSeries << endl; } // system("pause"); return 0; }
相关文章推荐
- javaScript笔记(二十一) 事件对象
- 二叉树与树的理解
- aac格式解析
- HDU 1255(线段树,扫描线,矩形的面积交)
- poj1083-Moving Tables-贪心
- String s=new String("abc")创建了几个对象?
- PCB布线规则
- Pyhton的发展历程
- html导入css样式的方法
- 核心动画-关键帧动画易混淆属性记录
- 8-15日记
- 114. PHP command line getopt
- SwipeRefreshLayout完美添加及完善上拉加载功能
- hdu2196Computer(树形dp)
- php学习笔记05
- 简谈动态规划
- C#入门8.9——Main方法
- Spring jar 下载地址
- ARM多核处理器启动过程分析【转】
- AFNetworking 关于JSON text did not start with array or object and option to allow fragments not set 错误