原题地址:《The Suspecst》
题目大意:某学校有N个学生,M个社团,每个学生可以属于多个社团。SARS流行,但是社团活动频繁,一旦一个社团有一个人是SARS疑似,所有人都是SARS疑似。现在假定第0号学生是SARS疑似,求所有疑似病例。
这个就是典型的并查集问题……我挑了这个最水的问题实践了一下。和刚才哪篇并查集无异。数据弱所以连rank union都不用就能过。
思路是:每个社团读取后直接把他们union起来。最后将学生0的parent和其他N-1个学生比较(来判断[......]
原题地址:《The Suspecst》
题目大意:某学校有N个学生,M个社团,每个学生可以属于多个社团。SARS流行,但是社团活动频繁,一旦一个社团有一个人是SARS疑似,所有人都是SARS疑似。现在假定第0号学生是SARS疑似,求所有疑似病例。
这个就是典型的并查集问题……我挑了这个最水的问题实践了一下。和刚才哪篇并查集无异。数据弱所以连rank union都不用就能过。
思路是:每个社团读取后直接把他们union起来。最后将学生0的parent和其他N-1个学生比较(来判断[......]
背景:如果我们需要将元素划分到若干不相交的子集中,使用并查集可以快速确定某两个元素是否位于同一个子集。
并查集是一种数据结构,除了Union-Find Set,又叫做Disjoint-Set。更确切的说,它主要包含了两种操作:Find和Union。具体信息可以见维基百科:《Disjoint-set data structure 》
并查集主要包含两个操作:
Find(x):返回元素位于那个划分的子集合内。
Union(x, y):将x, y两个集合中的元素合并为一个集合。[......]
[......]
队列(queue)是一种先进先出(FIFO)的线性表。只允许在一端进行插入,而在另一端删除元素。
允许插入的一端叫做队尾,允许删除的一端叫做队头。
双端队列(deque):限定插入和删除操作在表两端进行的线性表。
双端队列在一些限定条件下可以退化为:
(1)普通队列(只能在一端插入而另外一端删除)
(2)两个栈底相连的栈
队列 / 双端队列的定义:
由于可以在双端操作,所以肯定得有一个head,一个rear(tail)。我觉得确实用一个多的空头表示比较合适,然后[......]
堆栈与递归是相辅相成的。
比如Fibnacci数列就是递归定义:
Fib(n) = Fib(n-1) + Fib(n-2) (n>=2) Fib(0) = 0 Fib(1) = 1
Fibnacci数列:1, 1, 2, 3, 5, 8, 13, 21, ....
说到这里再写个Fibnacci的通项公公式:
然后再一个例子是书上的Ackerman函数:
转回经典的汉诺塔问题:假设有三个命名为X,Y[......]