2017开学训练第九周周中总结

  感觉同时重点看数学和图论还是难了一些,但是也算是能给我换换脑子吧。

  这周周一只看了一下图论强连通的Kosaraju算法,因为刚比赛回来,各种强制补作业也是很头疼。就说这个算法而言,我在哈工大的图论书上并没有说完全看懂,里面有这样几个疑点,首先,他这个一图两用到底是怎么个存法,在介绍里只说是正着搜一遍,再反着搜一遍,我的理解是就是能不能回退到原来的点,所以并不懂他这个东西是怎么存的,第二个疑点就是真的只通过访问时间就可以确定里面的强连通分量有几个吗,始终不明白这一点。

  周二的训练复习了一下数论里面的基础知识点,结果卡在拓展欧几里得算法上了,我记得当时资料上 就含糊其辞,然后觉得可能是欧几里得算法的一个升级版,就没在意,可这一遍看资料发现好多地方都用到了这个拓展欧几里得算法,就查资料把他彻底弄懂了。所谓扩展,并不是升级版,而是在求gcd的同时额外求了一个不定方程ax+by=n(其中这个方程有解的充分必要条件就是n能整除gcd(a,b)。思路就是反复利用这个充分必要条件,得到一个递推式,也就是这一层的x和y分别和下一层x1,y1有什么关系,然后就可以求解得到。之后下午硬着头皮看了一下强连通的第二个算法Tarjan算法,毕竟解决同一个问题,先都看一遍说不定会对第一个算法有帮助,结果我预料错了,这个算法好像并没有给我带来第一个算法的解题思路,反而留下了如下几个问题,这个算法的基本思路就是通过访问时间和low数组的关系来求每个强连通分量的根节点,用栈存每个点,只要是在根节点之后入栈的点都属于这个根节点所在的强连通分量,依次出栈并进行标记。根节点的判断依据仿佛就是low==访问时间。但是还是没有相同为什么这样可行,因为只有能互相到达才能说我是一个强连通分量,但是他这里仿佛只用了一遍访问解决了所有问题。

  周三基本满课,晚上吃完饭写了写作业,然后打了场练习赛,总的来说这个比赛很水,我们本来说的打team work,但是好像都在埋头做题,谁也没理谁,这次吸取教训,再也不开百度翻译了,所以题意理解的慢了许多,但是并不影响这些题是水题的事实。大概到十点半左右,由于快熄灯了,加上第四题那个通量我始终没有搞没明白,就放弃了a题,看了一会前两天留下的问题,后来队友给我说他在最后十五分钟开了百度翻译发现这也是一个水题,简单说明了题意之后还是没能敲完,队友最后几秒过的,确实就是一个暴力题。

   接着周四想继续硬着头皮看完所有的强连通分量的算法,发现操作里有多了一个栈,果断放弃,查资料攻克第一个算法,然后明白了其中的玄机。书上没写明白的两个要点才是这个算法的关键,第一,就是这个图是要先遍历他的反向图决定顺序,所以存的就是正向图和反向图,第二就是这个算法的dfs并非正常的dfs决定顺序,而是一个dfs的逆后序遍历,也就是最先访问的点最后入栈,这就决定了这个对反向图的遍历决定的顺序可以使得正向图的遍历不会从一个树上跑到另外的树上去,证明网上也没有明说,只是说可以举例,但是我确实还是很想知道。然后就是这个Tarjan算法,看了一个dalao的博客,他说他做这个算法用了整整半天,因为找不到好的相关的资料,(后来因为有疑点,我还真去查了资料,发现只有这个人写过这个算法),但是我认为这个人并没有真正理解这个算法,因为有一个最重要的疑点他没有在证明中提到,注意是题都没有提到,这就让双智看了想打人了,先不说你从哪里查的资料,你既然说你会了,就应该解释明白。无奈之下只好自己把这个算法想了一遍,总算想出来为什么了。这个算法很重要的一点就是他是去遍历,所有的点,我看到的两个资料都有这样的一段解释:就是说如果dfn[k]==low[k](在遍历完之后),那么这个k点就是某个强连通子图的根节点。由于是遍历得到的,比k晚入栈的点k都可以直接或者间接的达到,这个是大佬博客上证明的原句,那么他忽略了最重要的一点,要成为一个强连通子图,那么就要满足我能到达你的同时,你也能到达我,但是,他这里只给出了我为什么能到达你,却没有说明你为什么能到达我。现在我就来说明为什么你也能到达我。这个问题的入手点就在于根节点k的值的更新完全是跟后来他能访问到的点有关系(由于这个点被访问过,temp[k]==1,所以不会再被访问)。所以这也是让人困惑的地方,但是下一个算法正好是这个算法的另一种实现,它里面的一句话点醒了我。也就是在Tarjan算法中,只有遇到环的时候low的值才会更新。这句话一开始我不懂,但是后来想明白了,如果说栈顶的点不能到达k点,但是它又是这个栈的栈顶的一个点,那么他的low一定等于dfn,但是如果他能到达k就不同了,因为虽然算法到底了,但是不管能不能继续,只要他能到达的这个点的temp==1,那么low就有一次更新,它的值就不再是自己了,那么这样它一定属于其他的强连通分量,在回到k之前就应该出栈了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值