Ruins He's house

Enjoy the daily life

这道题有两个重要的地方,一个是对题目的理解,合法的操作只有一种,那就是对相邻的两个状态不同的灯泡进行交换状态的操作,也就是说,相邻的灯泡如果都是亮着的或者暗着的,那么不能对这条边进行操作。

第二点,那就是由于所有的状态的目标状态都是一样的,那么我们就可以从目标状态进行 BFS,计算出其他状态到目标状态要多少步,注意当 BFS 的步数大于 33 的时候,就不要将其子状态放入队列中,为了方便,之前将全部的状态的需要步数设置为 5,这样即使没有访问的状态,步数也是大于 33 的,这个算法的时间复杂度是 O(323)O(32^3),完全可以接受,之后就是 O(1)O(1) 的查询。

为了方便 BFS,优化空间,运用位压缩,将 1616 个灯泡的状态用一个 int 来存放,高位存放低编号的灯泡,装换的时候就用异或运算即可。

数组 xxyy 用来对应 3232 对相邻的灯泡

阅读全文 »

许多分类,把这题分到了最短路里面,也看过一些用 Floyd、SPFA 的写法,但是我觉得,这题没必要想太复杂,直接建立最小生成树,在建树的过程中,如果加入了一条边,使得起点和终点连通了,那么这条边一定是最大的那条,也就是答案。

我的代码如下,每次加入一条边,判断 0、1 的连通性。

阅读全文 »

虽然这题用排序可以轻松搞定,但是我们可以考虑用二分匹配,在 O(n2)O(n^2) 的时间内得到答案。

将两个字符串中每个字母的数目进行统计,然后得到一个有 26 对结点的二分图,对二分图跑一次最大匹配,当且仅当最大匹配数等于 2626 的时候,输出 YES,否则输出 NO。

二分版本的代码,运用匈牙利算法实现:

阅读全文 »

这题算是数据结构类型的题目了吧,运用并查集可以快速地解决此类问题,从头往后读取数据,如果读取到的两个点不在同一个集合里,就将他们合并,否则,这条边就是多余的,将多余的边放入栈 stst 中。处理完边之后,线性扫一遍结点数组,找出所有的根结点放入栈 donedone 中。

之后从 stst 中取出一元素,将 donedone 中的两个元素连起来,然后任意去掉一个元素,留下一个元素,不断进行,直到栈 stst 空了为止结束循环。

这个过程主要是运用好栈和并查集。。

阅读全文 »
0%