并查集2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

并查集。

1、概念:

如果:给出各个元素之间的联系,要求将这些元素分成几个集合,每个集合中的元素直接或间接有联系。在这类问题中主要涉及的是对集合的合并和查找,因此将这种集合称为并查集。并查集是一种树型的数据结构,它是一个集合,这个集合的元素也是集合,常常在使用中以森林来表示。

2、并查集的主要操作:

①合并两个不相交集合

②判断两个元素是否属于同一集合

初步分析觉得本题是一个图论中判断两个点是否在同一个连通子图中的问题。

1、识别水果模9第1题

在海上漂泊了249天后,由于食物和水都已消耗光了,三人已是筋疲力尽。终于,在第250天的早晨,一个隐隐约约的黑点在远处出现了,是一个小岛,三大护法高兴的几乎要跳起来。于是下令舰队全速前进,驶向小岛。

在登陆后,他们才知道,这就是著名的移花岛,岛上有三位女神:dp女神、涓涓女神和紫晶女神。由于三大女神与holy_one的关系不错,因此高兴地接待了他们三人。由于看到三人饥渴难耐,负责岛上水果的涓涓女神便带他们去了果园。

果园里水果丰富,共有n个,它们的标号为1~n,但有些水果是有毒,而且水果与水果之间有藤蔓相连,如果一个水果有毒,那么所有与它相连的所有水果都是有毒的。其中m 个水果上面会贴着一个标签,从标签上可以看出这个水果是否有毒。当然,如果这个水果的标签显示无毒,但它与有毒的水果相连,那它也是有毒的。

为帮助三人尽快吃到水果,涓涓女神给了他们一张毒物字典,只有通过字典上的对应关系翻译后,才能知道水果是否有毒。转化后的名称中包含'poison',即表示这个水果有毒。输入:

第一行,字符串a

第二行,字符串b

a串和b串长度都是26,a[i]到b[i]表示两个字母的对应关系。注意,对应关系是单向的。两个整数n和m。

以下m行,

每行第一个数是水果的标号k,后面是第k个水果的标签s

k和s之间有空格分隔开

一个整数p。

以下p行,每行两个整数x,y表示第x个水果和第y个水果之间有藤蔓相连

输出:

无毒的水果的个数s:array[‘a’..’z’] of char;

样例输入:

abcdefghijklmnopqrstuvwxyz s1 s[s1[i]]:=s2[i]

abcdefghijklmnopqrstuvwxyz s2

3 2

1 poison x[i]:=x[i] or x[j]

2 viking

1

1 3

1 4

2 4

4 5

样例输出:

1

各点1s。

30%的数据保证n<=2000,m<=500,p<=2000;

100%的数据保证n<=10000。m<=5000,p<=50000;

100%的数据保证所有字符串的长度<=100

2、联络(contact)模5第2题联络

【题目描述】

在成功破译了CCF的来信之后,NOIP群决定迎战CCF,但是现在面临一个问题,由于NOIP群的各位成员不在一起,所以现在要开始联系成员。在我们伟大的NOIP群里已经公示了CCF的来信,一些经常活动的成员得到消息并且已经联系到了部分成员,但是我们是一个组织,不能单独行动,因此必须要听从群主的号令,于是,必须所有成员都要能够直接或间接联系到群主才可以。为了保密,此次行动不采用网络方式联系,我们有一个只属于群内成员的特殊联系方式,这种方式最大的优点是保密功能极为强大,但是费用也不低,由于我们的经费有限,为了能留出更多的经费前往CCF,我们要在联系过程中尽量节省费用。你的任务就是编程计算出联系到所有成员的最少的费用以及得到最少费用的方式。

【输入格式】

第一行一个数n,代表一共要联系到的成员有n个,接下来一个n+1行有一个(n+1)*(n+1)的矩阵,第i+1行第j个数代表第i个人与第j个人联系的费用(群主编号为1),然后一个数m,接下来m行,每行两个数i和j,代表第i个人和第j个人已经相互联系到(数据保

证没有环)。

【输出格式】

第一行一个数z,代表最小费用,接下来若干行,

每行两个数x和y,代表要第x个人与第y个人相联系(按顺序输出)。

【样例输入】

4

0 1 2 3 7 for i:=1 to n do

1 0 4 6 10 for j:=i+1 to n do

2 4 0 5 9 inc(t);a[t].b:=I;a[t].e:=j;a[t].w:a[I,j]

3 6 5 0 8

7 10 9 8 0 for i:=1 to t do

2 x:=a[i].b ;y:=a

4 5 x:=get(x); y:=get(y);

2 5 if x<>y then inc(sum,w)

【样例输出】

3

1 2

1 3

【数据范围】

对于40%的数据m

对于100%的数据m

数据保证输出不超过231-1。

3、关押罪犯(prison.pas/c/cpp)模35第3题

【问题描述】

S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。

在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?

【输入】

输入文件名为prison.in。输入文件的每行中两个数之间用一个空格隔开。

第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。

接下来的M 行每行为三个正整数a j,b j,c j,表示a j 号和b j 号罪犯之间存在仇恨,其怨

气值为c j。数据保证1

【输出】

输出文件prison.out 共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出0。

【输入输出样例】

prison.in prison.out

4 6

1 4 2534

2 3 3512

1 2 28351

1 3 6618

2 4 1805

3 4 12884

3512

【输入输出样例说明】

相关文档
最新文档