图论题,思路就是,首先把每条边的两端的顶点数统计出来,并且取较小的那一个数,这个数的含义是,最多会有多少对 family 路过这条路。然后用这些数乘以它相应的权值,再乘以 2 就可以了。

由于极端情况下,节点数会达到 105, 路径长度会达到 106, 这已经明显超过 32 位整型了。所以需要用 long long. 需要注意的地方就是,如果两个 int 相乘,其结果可能会达到 long long 的话,那么先把两个 int 分别转换成 long long 再乘。至于为什么就不多解释了。

还有极端情况,比如整棵树退化成了链,100,000 个节点要是深搜的话,就 stack overflow 了。所以需要用栈模拟递归。但是我记得我们队的 WH 在某次练习的时候,用深搜成功解决了这个问题,这有两个方面的原因:一个是他的 dfs 函数没有返回值,并且只有一个参数;二是他是从中间那个顶点开始进行深搜的。所以,他骗分导论学得不错啊。

这道题我 WA 了几次,有因为数组开小了,有因为没有使用栈模拟递归的,还有因为没看清到底是应该使用 %lld 还是 %I64d 的。所以以后一定要吸取教训。

还有就是这道题我写了一个数据生成器,树结构的数据生成器还是比较麻烦。

本题源代码

数据生成器源代码

原创文章,转载请注明来源:http://euyuil.com/3227/acm-icpc-2011-chengdu-holiday-accommodation/