首先,江老师评价了一下我们的博客,说我的tree那题没有用新学的方法做,所以我就在博客上贴了程序
在这里,江老师讲了两个很重要的概念:
1、静态和动态:
按照tree那题来举例:
按照杨鸿飞的方法压缩路径就是属于静态,而用我们学的方法就是属于动态:
静态:
for(int i=1;i<=n;i++)
fa[i]=getf(i);
动态:
while(fa[x]!=x)
{
int y=fa[x];
fa[x]=root;
x=y;
}
静态就是整个变化过程完了之后在处理,动态就是有变化就处理,有变化就处理。
静态——最后处理;
动态——中间处理;
好吧其实我写想和博客时都有点晕,不怎么搞得清楚,不过到时候江老师会再详细地讲,到时候再做补充吧。
2、不会做题时找出思绪的有效方法:
画大量的例子!!
这样一能让我们熟悉题目的特征,二来有时还能找到一些规律。
好吧暂时先写这么多,回到家再写吧。
回家续写:
后来老师又讲到galaxy,说到了它的解题思路:
由于这题属于并查集,而并查集的特点就是压缩路径,所以就是讲了 压缩路径的方法(不压缩路径也会超时)。
先定义一个结构体,里面除了包括正常那些外,在加多一个这个这个节点到根的距离。每次需要用到这个节点时就求距离,然后把两个节点的距离差求出来,就能求出这两个节点(舰队)之间有多少个节点(舰队)。
接着老师讲了递归来找根,这样不仅能顺便压缩路径,而且程序非常短。
int getf(int x) { if(x==fa[x]) return x; return fa[x]=getf(fa[x]); }
|
程序十分简单,但是也有一点小问题:
1、 如果这棵树特别深,那么就要开十分多的getf()函数,这有可能空间会爆掉。
2、 如果是一个环形,像这个一样怎么办?它会无限递归一直退不出来。
所以我们就要用到“启发式”来解决:拿小的来连大的。
具体如何做江老师说以后会学到,那么就先不要理它了。
然后江老师顺便讲了一下明天要学的哈希(hash)算法,大概就是说如何快速比较两个数的不同之类的。今天特别晚,那这个就留到明天的博客再写吧。