当前位置:文档之家› 并查集2

并查集2

并查集2
并查集2

并查集。

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

【输入输出样例说明】

罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。【数据范围】

对于30%的数据有N≤15。

对于70%的数据有N≤2000,M≤50000。

对于100%的数据有N≤20000,M≤100000。

1 2

4 3

6618 1805

2534 3512

12884

28351 1 2

4 3

2534 3512

ACM经典算法及配套练习题

POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,p oj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序(poj1094) (5)二分图的最大匹配(匈牙利算法) (poj3041,poj3020) (6)最大流的增广路算法(KM算法). (poj1459,poj3436) 三.数据结构. (1)串(poj1035,poj3080,poj1936) (2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299) (3)简单并查集的应用. (4)哈希表和二分查找等高效查找法(数的Hash,串的Hash) (poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503) (5)哈夫曼树(poj3253) (6)堆 (7)trie树(静态建树、动态建树) (poj2513) 四.简单搜索 (1)深度优先搜索(poj2488,poj3083,poj3009,poj1321,poj2251) (2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414) (3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129) 五.动态规划 (1)背包问题. (poj1837,poj1276) (2)型如下表的简单DP(可参考lrj的书page149): 1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533) 2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) (poj3176,poj1080,poj1159) 3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题) 六.数学 (1)组合数学:

ACM一期 基础训练计划

这个训练计划我也只是把我知道的知识点罗列出来而已. 其实acm还有很多方面的知识。 可能到acm生涯结束的时候还是无法把所有的知识都吃透 所以acm的知识能学多少算多少,知识重要的不是你知道的多,重要的是你能否熟练的运用他们! 题目注意事项: zoj:https://www.doczj.com/doc/5c12527938.html,/ grid:https://www.doczj.com/doc/5c12527938.html,/ hdu:https://www.doczj.com/doc/5c12527938.html,/ zquoj:也就是我们的oj 一.数据机构基础。 请自学完数据结构书:2,3,4,6,7,9.1,9.2.1 9.3 10 这几章,带*号可以暂时掠过,以后再看。然后自行完成oj DS开头的题目。 注意栈队列这些数据结构一般不用像书本那样写得那么严谨。在acm中,往往因为时间关系,一般写成简单的模式:请参考附件:栈与队列acm中的简单实现.txt 其它数据结构请自行简化。 二.其他数据结构 1.trie树 请看附件trie树的相关附件或到网上搜索。注意自己写好和简化模版。 Trie树最好使用静态分配实现! poj 3630 hdu 1251 2.并查集 Hdu:1558 1811 1829 1198 3.图论专题: 简单的说下图怎么存储。 图通常分为邻接表和邻接矩阵两种方式储存。 请先移步到数据结构书祥看这两种实现方式。 邻接表:我们知道要动态分配内存。这种方式有时会导致效率低下。我们可以模拟一下动态分配内存,详见附件静态分配。 这部分图论可参考 https://www.doczj.com/doc/5c12527938.html,/p-251720691.html 部分题目.这本书有讲解。 1.图的基本概念 poj:1659 2.图的遍历和活动问题 zoj:2110 1709 1649 2913 1060 2193 2412 1008 2165 1136 1361 1091 1083 poj:2935 1270 3687

信息学奥赛-并查集

信息学奥赛中的特殊数据结构——并查集 在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能采用一种全新的抽象的特殊数据结构——并查集来描述。 一、数学准备 首先,我们从数学的角度给出等价关系和等价类的定义: 定义1:如果集合S中的关系R是自反的,对称的,传递的,则称他为一个等价关系。 ——自反:x=x; ——对称:若x=y,则y=x; ——传递:若x=y、y=z,则x=z。 要求:x、y、z必须要同一个子集中。 定义2:如果R是集合S的等价关系。对于任何x∈S,由[x]R={y|y∈S and xRy}给出的集合[x]R S 称为由x∈S生成的一个R的等价类。 定义3:若R是集合S上的一个等价关系,则由这个等价关系可产生这个集合的唯一划 分。即可以按R将S划分为若干不相交的子集S 1,S 2 ,S 3 ,S 4 ,……,他们的并即为S,则这 些子集S i 变称为S的R等价类。 划分等价类的问题的提法是:要求对S作出符合某些等价性条件的等价类的划分,已知集合S及一系列的形如“x等价于y”的具体条件,要求给出S的等价类的划分,符合所列等价性的条件。(我们上面提到的联系,即可认为是一个等价关系,我们就是要将集合S划分成n个联系的子集,然后再判断x,y是否在一个联系子集中。) 二、引题——亲戚(relation) 【问题描述】若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。(人数≤5000,亲戚关系≤5000,询问亲戚关系次数≤5000)。 【算法分析】 1. 算法1,构造图论模型。

ACM题目整理

题目来源:福州大学acm网站 代码:fpcdq 一、入门 熟悉ACM竞赛规则以及程序提交注意事项 例题: Problem 1000 A+B Problem Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description Calculate a + b. Input The input will consist of a series of pairs of integers a and b,separated by a space, one pair of integers per line. Output For each pair of input integers a and b you should output the sum of a and b in one line,and with one line of output for each line in input. Sample Input 1 5 2 3 Sample Output 6 5

My answer: #include main() { long a,b; while((scanf("%ld%ld",&a,&b))!=EOF) { printf("%ld\n",a+b); } } 详情参考https://www.doczj.com/doc/5c12527938.html,/faq.php 二、ACM分类 主流算法: 1.搜索//回溯 Problem 1019 猫捉老鼠 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 一只猫和一只老鼠在10*10的迷宫中。迷宫中的每个方格可以是空的,或者含有障碍。猫和老鼠可以进入任意一个空的方格中。当他们相遇时,猫和老鼠在同一个方格中。但是,无论猫或老鼠都不能进入有障碍的方格。我们可以用字符组成的二维数组表示迷宫,如下图所示。

数据结构

第一章:绪论 1.数据结构的基本概念和术语 ?数据、数据元素、数据项、数据对象、数据结构等基本概念 ?数据结构的逻辑结构,存储结构及数据运算的含义及其相互关系 ?数据结构的四种逻辑结构及四种常用的存储表示方法 2.算法的描述和分析。 ?无穷大阶的几种描述方法的区别 ?算法特征及其评价标准 ?算法的时间复杂度和空间复杂度的概念 ?几种常见复杂度的好坏程度 ?就(原)地算法的含义 ?算法描述和算法分析的方法 1. 设n是偶数,试计算运行下列程序段后m的值,并给出该程序段的时间复杂度。 m=0; for (i=1; i<=n; i++) for (j=2*i; j<=n; j++) m=m+1; 2. 下列算法对一n位二进制数加1,假如无溢出,该算法在最坏情况下时间复杂度是什么?并分析它的平均时间复杂度。 void func (int A[n]) //A[n]中每个元素取值0或1 {inti = n; while (A[i] == 1) { A[i] = 0; i-} A[i]=1;} 3. 调用下列函数f(n) 回答下列问题: (1)试给出f(n)值的大小,并写出f(n) 值的推导过程; (2)假定n= 5,试指出f(5)值的大小和执行f(5)时的输出结果。 int f(int n) {inti, j,k, sum= 0; for(i=1; ii-1; j--) for(k=1; k

并查集检查网络课程设计报告

数据结构与算法 课程设计报告 课程设计题目:并查集检查网络 专业班级:信息与计算科学1001班 姓名:学号: 设计室号: 设计时间: 2011-12-29 批阅时间:指导教师:成绩:

《数据结构与算法》课程设计报告 (2) 一、课题:并查集检查网络 (3) 1.题目要求: (3) 2.输入要求: (3) 3.输出要求: (3) 二、并查集操作 (4) 1.Creat() (4) 2.find(int e) (4) 3.hebin(int A ,int B) (4) 三、并查集的优化 (5) 1.路径压缩 (5) 2.启发式合并 (6) 四.问题实现 (6) 五.数据显示: (10) 《数据结构与算法》课程设计报告 姓名: 学号: 专业:

一、课题:并查集检查网络 1.题目要求: 给定一个计算机网络以及机器间的双向连线列表,每一条连线允许两端的计算机进行直接的文件传输,其他计算机间若存在一条连通路径,也可以进行间接的文件传输。 请写出程序判断:任意指定两台计算机,它们之间是否可以进行文件传输。 2.输入要求: 输入若干测试数据组成。 对于每一组测试,第1行包含一个整数N(≤10000),即网络中计算机的总台数,因而每台计算机可用1到N之间的一个正整数表示。 接下来的几行输入格式为I C1 C2或者C或者C C1C2或者S,其中C1和C2是两台计算机的序号,I表示在C1和C2间输入一条连线,C表示检查C1和C2间是否可以传输文件,S表示该组测试结束。当N为0时,表示全部测试结束,不要对该数据做任何处理。 3.输出要求: 对每一组C开头的测试,检查C1和C2间是否可以传输文件,若可以,则在一行中输出“yes”,否则输出“no”。当读到S时,检查整个网络。若网络中任意两机器间都可以传输文件,则在一行中输出“The network is connected.”,否则输出“There are k components.”,其中k是网络中连通集的个数。两组测试数据之间请输出一空行分隔

ACM必做50题——模拟

1、POJ 1029 False coin Slyar:又是假币判断问题,跟POJ1013类似,不过这个题用1013那个算法W A了...后来换了种枚举的算法才过...思路就是假币应该在每个不等式中都出现,最后只要看哪个硬币出现的次数和不等式出现的次数相同,如果这个硬币唯一,那它就是确认的假币。 #include #include using namespace std; const int MAX = 1001; int main() { int n, k, p, total = 0; char sign; /* 记录原始数据*/ int t[MAX] = {0}; /* 标记硬币真假*/ int r[MAX] = {0}; /* 记录硬币重量*/ int w[MAX] = {0}; cin >> n >> k; while (k--) { /* 读入原始数据*/ cin >> p; for (int i = 0; i < 2 * p; i++) { cin >> t[i]; } cin >> sign; /* 标记肯定为真的硬币*/ if (sign == '=') { for (int i = 0; i < 2 * p; i++) {

r[t[i]] = 1; } } /* 左轻右重*/ else if (sign == '<') { total++; for (int i = 0; i < p; i++) { w[t[i]]--; } for (int i = p; i < 2 * p; i++) { w[t[i]]++; } } /* 左重右轻*/ else if (sign == '>') { total++; for (int i = 0; i < p; i++) { w[t[i]]++; } for (int i = p; i < 2 * p; i++) { w[t[i]]--; } } } /* 假币在不等式中每次都应该出现*/ int count = 0, pos = 0; for (int i = 1; i <= n; i++) { if (r[i]) { continue; } /* 找出每次都出现的"假币" */ if (w[i] == total || w[i] == - total) { count++; pos = i;

杭电acm部分题目及答案答案

自己刷的题 这是我在杭电做题的记录,希望我的分享对你有帮助!!! 1001 Sum Problem***********************************************************1 1089 A+B for Input-Output Practice (I)********************************2 1090 A+B for Input-Output Practice (II)********************************5 1091A+B for Input-Output Practice (III)****************************************7 1092A+B for Input-Output Practice (IV)********************************8 1093 A+B for Input-Output Practice (V)********************************10 1094 A+B for Input-Output Practice (VI)***************************************12 1095A+B for Input-Output Practice (VII)*******************************13 1096 A+B for Input-Output Practice (VIII)******************************15 How to Type***************************************************************16 1001 Sum Problem Problem Description Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge). In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input The input will consist of a series of integers n, one integer per line. Output For each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer.

整理出ACM所有题目及答案

1111111杭电: 1000 A + B Problem (4) 1001 Sum Problem (5) 1002 A + B Problem II (6) 1005 Number Sequence (8) 1008 Elevator (9) 1009 FatMouse' Trade (11) 1021 Fibonacci Again (13) 1089 A+B for Input-Output Practice (I) (14) 1090 A+B for Input-Output Practice (II) (15) 1091 A+B for Input-Output Practice (III) (16) 1092 A+B for Input-Output Practice (IV) (17) 1093 A+B for Input-Output Practice (V) (18) 1094 A+B for Input-Output Practice (VI) (20) 1095 A+B for Input-Output Practice (VII) (21) 1096 A+B for Input-Output Practice (VIII) (22) 1176 免费馅饼 (23) 1204 糖果大战 (25) 1213 How Many Tables (26) 2000 ASCII码排序 (32) 2001 计算两点间的距离 (34) 2002 计算球体积 (35) 2003 求绝对值 (36) 2004 成绩转换 (37) 2005 第几天? (38) 2006 求奇数的乘积 (40) 2007 平方和与立方和 (41) 2008 数值统计 (42) 2009 求数列的和 (43) 2010 水仙花数 (44) 2011 多项式求和 (46) 2012 素数判定 (47) 2014 青年歌手大奖赛_评委会打分 (49) 2015 偶数求和 (50) 2016 数据的交换输出 (52) 2017 字符串统计 (54) 2019 数列有序! (55) 2020 绝对值排序 (56) 2021 发工资咯:) (58) 2033 人见人爱A+B (59) 2037 今年暑假不AC (61) 2039 三角形 (63) 2040 亲和数 (64)

数据结构复习要点

第一章数据结构基本概念 1、基本概念:理解什么是数据、数据对象、数据元素、数据结构、数据的逻辑结构与物理结构、逻辑结构与物理结构间的关系。 2、面向对象概念:理解什么是数据类型、抽象数据类型、数据抽象和信息隐蔽原则。了解什么是面向对象。由于目前关于这个问题有许多说法,我们采用了一种最流行的说法,即Coad与Yourdon 给出的定义:面向对象= 对象+ 类+ 继承+ 通信。 要点: ·抽象数据类型的封装性 ·面向对象系统结构的稳定性 ·面向对象方法着眼点在于应用问题所涉及的对象 3、数据结构的抽象层次:理解用对象类表示的各种数据结构 4、算法与算法分析:理解算法的定义、算法的特性、算法的时间代价、算法的空间代价。 要点:·算法与程序的不同之处需要从算法的特性来解释 ·算法的正确性是最主要的要求 ·算法的可读性是必须考虑的 ·程序的程序步数的计算与算法的事前估计 ·程序的时间代价是指算法的渐进时间复杂性度量 第二章数组 1、作为抽象数据类型的数组:数组的定义、数组的按行顺序存储与按列顺序存储 要点: ·数组元素的存放地址计算 2、顺序表:顺序表的定义、搜索、插入与删除 要点: ·顺序表搜索算法、平均比较次数的计算 ·插入与删除算法、平均移动次数的计算 3、多项式:多项式的定义 4、字符串:字符串的定义及其操作的实现 要点: ·串重载操作的定义与实现

第三章链接表 1、单链表:单链表定义、相应操作的实现、单链表的游标类。 要点: ·单链表的两种定义方式(复合方式与嵌套方式) ·单链表的搜索算法与插入、删除算法 ·单链表的递归与迭代算法 2、循环链表:单链表与循环链表的异同 3、双向链表:双向链表的搜索、插入与删除算法、链表带表头结点的优点 4、多项式的链接表示 第四章栈与队列 1、栈:栈的特性、栈的基本运算 要点: ·栈的数组实现、栈的链表实现 ·栈满及栈空条件、抽象数据类型中的先决条件与后置条件 2、栈的应用:用后缀表示计算表达式,中缀表示改后缀表示 3、队列:队列的特性、队列的基本运算 要点: ·队列的数组实现:循环队列中队头与队尾指针的表示,队满及队空条件·队列的链表实现:链式队列中的队头与队尾指针的表示、 4、双向队列:双向队列的插入与删除算法 5、优先级队列:优先级队列的插入与删除算法 第五章递归与广义表 1、递归:递归的定义、递归的数据结构、递归问题用递归过程求解 要点:·链表是递归的数据结构,可用递归过程求解有关链表的问题 2、递归实现时栈的应用 要点:·递归的分层(树形)表示:递归树

并查集超级易懂讲解

高级数据结构设计--并查集及实现学习笔记(有趣篇) 并查集的程序设计: 为了解释并查集的原理,我将举一个更有趣的例子。 话说江湖上散落着各式各样的大侠,有上千个之多。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气,绝对不打自己的朋友。而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人。这样一来,江湖上就形成了一个一个的群落,通过两两之间的朋友关系串联起来。而不在同一个群落的人,无论如何都无法通过朋友关系连起来,于是就可以放心往死了打。但是两个原本互不相识的人,如何判断是否属于一个朋友圈呢?我们可以在每个朋友圈内推举出一个比较有名望的人,作为该圈子的代表人物,这样,每个圈子就可以这样命名“齐达内朋友之队”“罗纳尔多朋友之队”……

两人只要互相对一下自己的队长是不是同一个人,就可以确定敌友关系了。 但是还有问题啊,大侠们只知道自己直接的朋友是谁,很多人压根就不认识队长,要判断自己的队长是谁,只能漫无目的的通过朋友的朋友关系问下去:“你是不是队长?你是不是队长?”这样一来,队长面子上挂不住了,而且效率太低,还有可能陷入无限循环中。于是队长下令,重新组队。队内所有人实行分等级制度,形成树状结构,我队长就是根节点,下面分别是二级队员、三级队员。每个人只要记住自己的上级是谁就行了。遇到判断敌友的时候,只要一层层向上问,直到最高层,就可以在短时间内确定队长是谁了。由于我们关心的只是两个人之间是否连通,至于他们是如何连通的,以及每个圈子内部的结构是怎样的,甚至队长是谁,并不重要。所以我们可以放任队长随意重新组队,只要不搞错敌友关系就好了。于是,门派产生了。 下面我们来看并查集的实现。 int pre[1000]; 这个数组,记录了每个大侠的上级是谁。大侠们从1或者0开始编号(依据题意而定),pre[15]=3就表示15号大侠的上级是3号大侠。如果一个人的上级就是他自己,那说明他就是掌门人了,查找到此为止。也有孤家寡人自成一派的,比如欧阳锋,那么他的上级就是他自己。每个人都只认自己的上级。比如胡青牛同学只知道自己的上级是杨左使。张无忌是谁?不认识!要想知道自己的掌门是谁,只能一级级查上去。find这个函数就是找掌门用的,意义再清楚不过了(路径压缩算法先不论,后面再说)。

ACM竞赛试题集锦

取石子游戏 Time Limit:1S Memory Limit:1000K Total Submit:505 Accepted:90 Description 有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。 Input 输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a 和b,表示两堆石子的数目,a和b都不大于1,000,000,000。 Output 输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。 Sample Input 2 1 8 4 4 7 Sample Output 1

跳蚤 Time Limit:1S Memory Limit:1000K Total Submit:198 Accepted:44 Description Z城市居住着很多只跳蚤。在Z城市周六生活频道有一个娱乐节目。一只跳蚤将被请上一个高空钢丝的正中央。钢丝很长,可以看作是无限长。节目主持人会给该跳蚤发一张卡片。卡片上写有N+1个自然数。其中最后一个是M,而前N个数都不超过M,卡片上允许有相同的数字。跳蚤每次可以从卡片上任意选择一个自然数S,然后向左,或向右跳S个单位长度。而他最终的任务是跳到距离他左边一个单位长度的地方,并捡起位于那里的礼物。 比如当N=2,M=18时,持有卡片(10, 15, 18)的跳蚤,就可以完成任务:他可以先向左跳10个单位长度,然后再连向左跳3次,每次15个单位长度,最后再向右连跳3次,每次18个单位长度。而持有卡片(12, 15, 18)的跳蚤,则怎么也不可能跳到距他左边一个单位长度的地方。 当确定N和M后,显然一共有M^N张不同的卡片。现在的问题是,在这所有的卡片中,有多少张可以完成任务。 Input 两个整数N和M(N <= 15 , M <= 100000000)。 Output 可以完成任务的卡片数。 Sample Input 2 4 Sample Output 12 Hint

数据结构总结

转载自South_wind的专栏 常见的数据结构运用总结 考虑到Obsidian三个成员的擅长领域,这段时间都在做杂题,算是学习各种算法吧,趁现在休息的时间,而且大家马上要备战今年的比赛了,写写自己专攻方面的一些心得吧 扯开线段树、平衡树这些中高级的东西,先说说基础的数据结构 栈 算是代码量最小的数据结构?出栈进栈都只有一句话而已 常见用途: 消去一个序列中的相同元素(做法大家应该都知道了吧,见过很多次了) 维护一个单调的序列(所谓的单调栈,dp的决策单调?) 表达式求值(经典的栈运用,如果使用的很熟悉的话,可以处理一元、二元运算,不过最近没见过类似的题目了) 用于辅助其他算法(计算几何中的求凸包) 队列 队列应该还是很常见的数据结构了,如果专攻图论的话,spfa应该是写烂了的 这里说到的队列,是狭义的普通的队列和循环队列,不包括后面讲的一些变形 注意循环队列的写法,尽量不要使用取模运算,不然的话,遇到不厚道的出题者,可以把取模的循环队列卡到死 常见用途: 主要用于辅助其他算法,比如说spfa,bfs等(建议习惯用stl的孩子手写queue,毕竟就几行代码而已,偷懒会付出代价的。。。) 双端队列 如果写dp写的多的话,这个东西应该还是算是比较基础的东西了,双端队列多用于维护一个满足单调性的队列 还是建议手写,stl的deque使用块状链表写的,那东西的复杂度是O(Nsqrt(N))的,不要被迷惑了。 常见用途: dp的单调性优化,包括单调队列优化和斜率优化,都要用到这个结构 计算几何中的算法优化,比如半平面交 树的分治问题中利用单调队列减少转移复杂度 链表Dancing Links 写图论的不要告诉我不会写这货,链表可以写单双向,循环非循环的,高级点儿的可以考虑十字链表,麻花链表 不过链表可以说是树形结构的基础,如果这个掌握的不好,那么树形结构写起来就会很纠结 链表的优势在于可以O(1)的插入删除,如果要求插入的位置只是在序列的两端的话,这个数据结构是最方便的了(无视双端队列) hash表就是用链表实现的,熟悉hash的同学可以试试看怎么使你的hash效率提高

并查集2

并查集。 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

ACM必做50题——数学

1、POJ 2249 Binomial Showdown 组合数学。 高精度,也可把分子分母的数组进行两两约分 #include using namespace std; double c(int c,int k) { double a=1; int i,j=2; for(i=c;i>c-k;i--) a=a*i/(c-i+1); return a; } int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF && (n!=0 || k!=0)) { if(k>n/2 )k=n-k; printf("%.0lf\n",c(n,k)); } return 0; } 2、poj 1023 the fun number system (经典进位制) 题意:一种由2进制衍生出来的进制方法(我们暂且称为“类2进制”); 标明'n'的位置上原2进制该位的权重要乘上-1,才是现在进制方法该位的权重; 譬如说;pnp对于的能表示的数2来说就是110;即1*2^2+(-1)*1*2^1+1*2^0=2; 算法:这是数论中的进位制问题,我们可以仿照原来的求一个数二进制表示方法; 但首先,我们应该考虑几个问题; ①k位这种类2进制的表示范围; 显然,当给出的'p','n'序列中,我们将所有p的位置都置为1其余位是0,此时最大;当我们将所有n的位置置为1,其余为0,此时最小;不过当我们求最大限max和最小限min时会

有一个溢出问题;比如64位全是p的序列,那么max会溢出,值为-1;同理min在全是n 时也会溢出,为1;显然是max>=0,min<=1,溢出时产生异常,依次可以判断; ②是否是最大限和最小限之间的数都能表示呢? 都可以,而且能够表示的数是2^k个,这个原始2进制是一样的;因为每个位上要么是0,要么是1,而且每个位上的权重唯一的,不能通过其他位的01组合获得;最后,我们就可以仿照原始二进制来算在类2进制下的表示;不断求N的二进制最后一位和右移;如果取余是1,则该位上一定是1,如果该位对于字母为‘n’,则高位应该再加1;这里对2取余可能会出错,因为对于负数,补码的表示,最后一位一定是和原码一样的每次的右移后(有时需先加1)补码表示正好符合要求(可找实例验证); #include using namespace std; __int64 N,M; char s[100],res[100]={'\0'}; int main() { int T;scanf("%d",&T); int i,j; __int64 _max,_min; char ch; while(T--) { scanf("%I64d",&N); scanf("%s",s); _max=0;_min=0; for(i=0;i_max&&_max>=0)) puts("Impossible"); //注意防止64位数的溢出; else { memset(res,'\0',sizeof(res)); for(i=N-1;i>=0;i--) { int flag=0; if(M&1) //这里不能是平常的%2; { res[i]='1';

ACM数论方面十道基础题目详解

1、公约数和公倍数 https://www.doczj.com/doc/5c12527938.html,/JudgeOnline/problem.php?pid=40 这道题目是非常基础的题目,在学习了欧几里德算法之后,应该很好就能做的出来了。注意两个数的最小公倍数和最大公约数之间有关系为: a*b=gcd(a,b)*lcm(a,b); 代码如下: #include using namespace std; inline int Gcd(int m,int n) //求最大公约数 { if (m==0) return n; return Gcd(n%m,m); } int main() { int n,a,b,g; cin>>n; while(n--) { cin>>a>>b; g=Gcd(a,b); cout<

?????≡≡≡)33(mod ) 28(mod )23(mod d n e n p n 那么找到k1、k2、k3满足: k1:k1%23==0&&k1%28==0&&k1%33==1 k2:k2%33==0&&k2%28==0&&k2%23==1 k3:k3%33==0&&k3%23==0&&k3%28==1 则n=k2*p+k3*e+k1*i+k*21252; 代码如下: #include int main() { int n,a,b,c,t; while(scanf("%d%d%d%d",&a,&b,&c,&t),~a) { n=(5544*a+14421*b+1288*c)%21252-t; if(n<=0) n+=21252; printf("%d\n",n); } } 3、韩信点兵 https://www.doczj.com/doc/5c12527938.html,/JudgeOnline/problem.php?pid=34 这个题目也是很经典的中国剩余问题类的题目,思路跟上面差不多这道题目因为数据范围很小实际上暴力就可以过,但是这个题目不失为练习中国剩余的很好题目,所以建议大家用中国剩余定理做一下。 直接给出代码: 暴力求解代码: #include main() { int a,b,c,n; scanf("%d%d%d",&a,&b,&c); for(n=11;n<100;n++) if(n%3==a&&n%5==b&&n%7==c) printf("%d\n",n); } 中国剩余定理思路代码:

部分ACM题目与答案

1001 Sum Problem (2) 1089 A+B for Input-Output Practice (I) (3) 1090 A+B for Input-Output Practice (II) (3) 1091 A+B for Input-Output Practice (III) (3) 1092 A+B for Input-Output Practice (IV) (3) 1093 A+B for Input-Output Practice (V) (3) 1094 A+B for Input-Output Practice (VI) (3) 1095 A+B for Input-Output Practice (VII) (3) 1096 A+B for Input-Output Practice (VIII) (3) 2000 ASCII码排序 (3) 2001计算两点间的距离 (3) 2002计算球体积 (3) 2003求绝对值 (3) 2004成绩转换 (3) 2005第几天? (3) 2006求奇数的乘积 (3) 2007平方和与立方和 (3) 2008数值统计 (3) 2009求数列的和 (3) 2010水仙花数 (3) 2011多项式求和 (3) 2012素数判定 (3) 2014青年歌手大奖赛_评委会打分 (3) 2015偶数求和 (3) 2016数据的交换输出 (3) 2017字符串统计 (3) 2019数列有序! (3) 2020绝对值排序 (3) 2021发工资咯:) (3) 2033人见人爱A+B (3) 2039三角形 (3) 2040亲和数 (3)

北京师范大学《数据结构》课程教学大纲

北京师范大学《数据结构》课程教学大纲一、课程基本信息 中文名称: 数据结构 英文名称:Data Structure 课程类别(公共任选课、学科基础课、专业方向课):学科基础课 学分: 4学时: 48+32 建议开设学期:2 开课单位建议:信息科学与技术学院 主讲教师: (姓名) 沈复兴(性别) 男 (职称) (学科方向) 教授 计算机软件 郑新 女 副教授 计算机应用 肖永康 男 讲师 计算机应用 二、课程目标: 本课程的主要目标是使学生深入了解数据结构的思想和数据结构的实现方法,特别是数据结构在实际工作中的应用和技术。本课程追求理论联系实际,实践教学与相应的教学内容相呼应。在形式上,灵活多样地采取了实践、拓展性学习、报告会等多种形式,目的在于加深学生对所学内容的理解,发展学生从事发展算法与程序设计研究和实践的能力,努力做到学以致用,同时激发学生的学习兴趣和主动参与精神,更好地掌握和运用所学习的知识。 三、课程内容与主要学习材料(含教材及参考书目) 课程内容: 第一章 绪论 1. 教学内容: ?数据结构的一些基本概念:数据、数据元素、数据的逻辑结构、物理结构、算法等。 ?抽象数据类型。 ?描述算法的程序语言(C++)。 ?算法时间复杂度和空间复杂度的分析。 2. 教学目的及要求

?掌握数据、数据对象、数据元素、数据结构、数据的逻辑结构与物理结构、逻辑结构与物理结构间的关系等数据结构的基本概念; ?了解数据类型、抽象数据类型、数据抽象和信息隐蔽原则以及面向对象这种数据抽象实现方法 ?了解算法的定义、算法的特性、算法的时间代价、算法的空间代价 ?掌握用C++语言描述算法的方法,能够使用C++语言编写程序 3. 教学重点 数据结构的概念;算法分析;C++语言。 4. 学时分配 本章共教授4学时. 第二章数组 1. 教学内容 ?线性表的基本概念 ?顺序表:顺序表的定义和特点;顺序表的类定义;顺序表的查找、插入和删除; 使用顺序表的事例;顺序表复杂度分析 ?特殊矩阵的压缩存储:特殊矩阵定义、稀疏矩阵类定义、矩阵转置与快速转置、矩阵乘法与输出 ?字符串:字符串类型定义;字符串操作的实现;字符串的模式匹配 2. 教学目的及要求 ?了解线性表的逻辑结构特性,以及线性表的两种存储实现方式 ?熟练掌握顺序表的定义与实现,包括搜索、插入、删除算法的实现及其平均比较次数的计算,掌握应用顺序表作为集合的简单操作 ?了解稀疏矩阵的定义及其数组实现 ?掌握字符串的定义及实现 3. 教学重点 线性表的基本概念、顺序表的实现及应用 4. 教学难点 矩阵的快速转置及模式匹配改进 5. 教学时间分配 本章共教授4学时. 第三章链表 1.教学内容 ?单链表:单链表的结构;单链表的类定义;单链表中的查找、插入与删除;带表头结点的单链表;单链表的游标类及静态链表 ?循环链表:循环链表的类定义及操作;用循环链表解约瑟夫问题; ?多项式及其相加:多项式的链表表示类定义;多项式的加法 ?双向链表:双向链表的类定义及操作 ?稀疏矩阵:稀疏矩阵的正交链表表示法及建立和删除操作 2.教学目的及要求 ?了解链表与数组一样,是一种实现级结构。有动态链表和静态链表之分 ?了解链表有单链表、循环单链表、双向链表之分 ?了解单链表的结构、特点 ?熟练掌握单链表的类定义、构造函数、单链表的查找、插入与删除算法

相关主题
文本预览
相关文档 最新文档