2019暑训 Day4 图论基础

Day 4

知识点晚一些补

vj

vj题目链接

A B
a和b都是dijstra的基本应用,不过b多了一个在最短路的约束求最短的开销。我用的是堆优化的dijstra算法,用到了node结构体小于运算符重载(必要)和结构体初始化(简便!建议系统的研究一下类的有关知识!)今天因为在node里定义了括号初始化的办法,导致了不能开没有初始化的空结构体(好像是因为要默认初始化云云)所以只能开出来后就立刻赋值,而且得在main函数的内层循环中开出来,又容易爆空间又逼死强迫症…
a的基本最短路办法只需要考虑严格小于的情况,这样子才有必要进行更新。但是b却要考虑小于等于,这样子在保证最短路长度的更新的下也保证了开销的不断更新。上午因为这个wa了一次立刻放了,以为是个复杂图有自环啊还是啥啥啥的没敢做…
有一个值得注意的写法是,在不断pop优先队列的元素时候,要比较temp.d 和dis[temp.to]是否一致,如果一致才代表了这是更新后的值,不一致说明是上一层的残次品,它不能代表该点真实的状态。

C
floyd算法,求任意两点的最短路的典型应用。wa了一发后差点绝望了…本来上午除了dij稍微有点懂,floyd略知一二,spfa都没来得及看…这一wa差点自闭…
当时检查了多组数据处理时全局变量的初始化问题,误以为全部更新完成了。后来在造数据测试的时候发现了问题…还是更新不够彻底…建议全局变量按照调用的顺序逐行定义,并且把全局变量的初始化按照顺序尽可能全部地放在void ini()里,每次处理新的一组数据时就调用该函数。

D
Euler图的路径求解,虽然没什么人做,但是很水。我第一次做以为要考虑euler path和erler circuit,针对奇数度数的情况分流处理。当时看了网上一篇blog,只要不断dfs到没有vis的点就并且把它存进来就可以。后来造数据发现…是存在可能性导致遍历完后留一个环在外面…就手动修改dfs算法,每次dfs完check一下所有点的vis情况,只有当全部访问到才dfs返回1、路径存入ans数组…修修改改好多次还是难逃一wa…最终上网搜寻欧拉图的路径求法…
一种的写法好像就是最开始看到的…???我照着写了而且ac了…不会漏一个环吗?…
还有一种叫Fleury算法…赶时间ac没有去学习它…链接也没有保存,但是刚刚搜索到一个看起来不错的博客,收藏一下:https://blog.csdn.net/qq_36551189/article/details/80905345

F
map把字符串转化到一个数字,再用vector< string >把这个数字转化到了原姓名。(从而构成了一个双向的映射关系?)尽管在后面造星星的时候没有用到,好像是啰嗦了 之后应该搜一遍所有入度为0的点,以他们为起点往下搜,看看能不能dfs后全部的点都被vis到。当然了,如果入度为0的点的数量为除了1以外的任何数字,那么肯定是不可以的。但是之后的搜索算法不会误判、漏判这种情况,所以也就没有啰嗦地去处理了,仅考虑了有可能的位置,没有考虑它的唯一性、存在性。

G
最开始还是误解了它的意思,wa了好几发后总算有点明白这个题的意思了。大体算法是一个拓扑排序与贪心的结合:利用拓扑排序的思想一层层分离开度为0的点,并且压入优先队列中,优先弹出最小的值。因为优先队列中的点都是度为0的点,并且他们的排名可以任意组合且都能保证合法(可以感性理解一下),所以我们考虑用一个小顶堆来记录这些点,从而符合题目要求的字典序排列。

明天暑训第一次组队练习赛,希望我们队好运~~

朝闻道,夕死可矣。


7月5号
K(n笔画问题的坑坑洼洼)
初看,n笔画的基础应用,算了度求了奇数度的个数除以2就往上交了,wa了一发后发现当度数为0时候是一个欧拉回路,应该需要一组蚂蚁才可以走完所有的边,而cnt直接除以2得到的是0,此处边界需要特殊考虑一下。随后又wa了一发,意识到了n笔画问题是针对一个连通图进行的操作,所以又用dfs搜了一遍所有联通图。之后又wa了一发,又意识到了,n笔画完成的任务是遍历完所有的 ,对于之前搜索的联通图可能不包含边,只有一个孤立点。至此,总算成功AC。

L
这道题是一个把距离抽象成开关switch的次数的floyd算法问题。开始暴力dfs搞了一发就t飞了,后来意识到了floyd的办法,又注意到数据的规模很小,进一步验证了这个办法的可行性,从而以此可以解决这个抽象的最短路问题。
但现在想来,既然单源最短路的模型已经确立,为什么当时会考虑到floyd而不是dijstra…emmmm…
dij应该也是一个可行的算法(不过这题数据小,floyd简单方便~

你可能感兴趣的:(ACM,图论)