并查集笔试题

来源:互联网 发布:jiragn 类似的软件 编辑:程序博客网 时间:2024/05/22 06:20
/*  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的长度<=100001<=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;elsep[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;}

0 0
原创粉丝点击