您的位置:首页 > 其它

并查集笔试题

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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: