并查集笔试题

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值