题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4276)
参考链接:http://blog.csdn.net/u012841845/article/details/18739425
以及:http://blog.csdn.net/xianxingwuguan1/article/details/18954537
手写邻接表:http://blog.csdn.net/ooooooooe/article/details/17035501
分析:先寻找1到N的最短路径和走这段路所用的时间,再把路径的权置为0,如果时间有多的,就把剩余的时间拿来进行树上背包,具体过程我已经写在了程序的注释里,之所以要写这个,是因为网上关于这道题的文章虽然很多,但都讲解得不是很清楚。
head数组是一种手写邻接表的方法,在上面的网址可以找到,但是该博并没有说明,所以我特地去请教了另外的人。它是图的另一种存储方法,head[a]表示以a为起点的边的编号,下面的add函数中的head[u] = tol++是在更新编号(即改为当前边的编号),表面上看起来它是在一直变化,但是每一次add它都会把自己的指存储在的edge结构体中,这样就可以根据一个head值一直找到它的父亲的父亲的父亲……另外,之所以说最短路上的边指走一遍是因为财宝只有那么多,拿了一次就没有了。
|
|
这道题花了两天时间,写了七八张纸都没有完全理解清楚,难道真的是我太愚笨了吗?