说来惭愧,ACM一直都单挑能力不行,发现自己的代码能力很差,经常自己写代码不走心,所以容易出现很多的低级错误。这里作为这个栏目的第一篇,我觉得有必要记录自己的常见错误的地方,以后注意力放上面就不容易出问题。
今天写了一个搜索题目,看起来比较难,其实很简单,就是普通的最短路添加了一个分值。。对于这个题目,只要在松弛的同时保持最大的score就可以,也是很常见的,我很容易出错的多重if判断。很容易少考虑。
考虑目前的边 t -> e ,路径权值是w , maxsco为维护的最大的score, 而sco[i]为i的分值,只要到上面就可以获得的分值。不要去简写这种复杂的松弛,尽量使所有的< , == , >都判断一下,除非不要,不要使用>=啥的,容易少考虑。多写函数来解决重复的代码,否则容易出现你改了这个忘了那个的情况。
if(dis[t] + w < dis[e]) {
dis[e] = dis[t] + w ;
maxsco[e] = maxsco[t] + sco[e] ; /// 出错之处,没有考虑如果小于直接想等。
PUSH(e)
}
else if(dis[t] + w == dis[e] && maxsco[e] < maxsco[t] + sco[e] ) {
maxsco[e] = maxsco[t] + sco[e] ;
PUSH(e)
}