该题是Floyd算法的一个巧妙变形,虽然AC率很高,但是真正要灵活变化到做出该题,显然要明白Floyd算法的思想和原理 ,弄清楚为什么可以这样更改算法的核心部分。
Floyd算法其实利用了动态规划的思想,适合求解几点不是很多的稠密图 。
我们都知道,动态规划在利用循环嵌套求解时是要规定一个次序的,这样才能将状态成功的转移 。该题的次序就是由k来定义的,从小到大枚举k,定义其意义为i和j之...
分类:
其他好文 时间:
2015-08-17 12:05:15
阅读次数:
121
该题恰好用到刚刚讲到的Floyd求传递闭包 , 因为该题的数据量不是很大, 要是大了估计就要用其他方法了 。 但是这毕竟是一个很简单易写的算法 。
求出传递闭包之后就用并查集将在一个电话圈的人合并在一起,最后输出 。
细节参见代码:
#include
using namespace std;
int n,m,d[30][30],par[30],kase = 0;
string s1,s2...
分类:
其他好文 时间:
2015-08-17 10:11:35
阅读次数:
121
一道很好的最小生成树题目 。 看似非常复杂,其实仔细分析一下算法的复杂度就会发现,如果加入了lrj说的优化,其实复杂度不高 。
就像紫书中说的, 除去购买套餐中的点,剩下的最小边仍然在原始的最小生成树中 。 所以我们用二进制枚举子集的方法枚举所有购买套餐的组合,然后将套餐中的点加入并查集中,再用原始最小生成树中的边补全当前生成树 。
二进制枚举子集的复杂度是2^8 。 补全生成树的复杂度是O...
分类:
其他好文 时间:
2015-08-16 21:25:04
阅读次数:
148
草草刷了一下暴力,开始转战图论了。 这是第一道例题,讲解了一种实用而神奇的树状结构:表达式树 。虽然打比赛从来没见过,但是我练这个本来也不只是为了比赛 , 重要的是ACM本身带给我的乐趣 。
该题的一个很巧妙的做法是将每一个结点用一个三元组来表示,然后映射到map中以去重 。 其中三元组中有一个string , 我们可以用hash来处理这个string 。
因为string最大长度为4, ...
分类:
其他好文 时间:
2015-08-16 18:21:42
阅读次数:
124
该是比较简单的BFS的 。 难点在于多了两个限制条件 : 必须按照顺序捡拾钥匙 ; 杀死蛇消耗2单位时间,蛇只会被杀死一次 。
因为在拿到第n把钥匙前必须拿到第n-1把,所以只需要加一维大小是11的维度来维护当前拿到的钥匙情况就可以完整的表示所有状态了 。
但是还有蛇的条件,所以不妨在结构体里加一个正数,将其压缩成一个集合表示第i只蛇是不是被杀死了 。 所以事先对所有的蛇进行编号就行了...
分类:
其他好文 时间:
2015-08-14 21:35:33
阅读次数:
267
今天集训队打比赛的一道题,很明显是个线段树,我们队照着lrj蓝书敲了一通,机智的将修改值和加和改成了位运算:|=
但是好像哪里出了点小问题,就是不对,赛后又水了一遍,竟然过了。。。发现还是lrj的书好啊,市面上的模板一点也不好用,连区间修改都没有 。
等集训完了要静心好好系统的学习一下线段树 。 多看多刷lrj的书 。
细节参见代码:
#include
using namespace ...
分类:
其他好文 时间:
2015-08-14 21:26:46
阅读次数:
153
题意:给定四点的坐标(x,y),分别确定两直线,求出其交点,若重合or平行则输出相应信息
分类:
编程语言 时间:
2015-08-14 19:02:35
阅读次数:
156
题意:大致就是给定一个斐波拉契-卢卡斯数列中的某一项an(题目没有说明,但是这其实就是斐波拉契卢卡斯数列),然后让你求出初始的斐波拉契-卢卡斯数列a1和a2的值,并使得a2尽可能小。
分类:
编程语言 时间:
2015-08-14 15:26:14
阅读次数:
219
Fractal 画图 这个题是个理解分治法很典型的例子(详情请参见Code)
分类:
编程语言 时间:
2015-08-14 13:07:28
阅读次数:
652
何为"打表"呢,说得简单点就是: 有时候与其重复运行同样的算法得出答案,还不如直接用算法把这组数据所有可能的答案都枚举出来存到一个足够大的容器中去-例如数组(打表),然后再输入数据的时候,直接遍历容器,检索这个数据是否有题意要求的结果。举一个几乎所有程序员都知道的简单例子= =: 求素数(P...
分类:
编程语言 时间:
2015-08-14 11:38:45
阅读次数:
895