七中高新信息学竞赛训练——2017寒假第二次练习赛题解

1.Study
拓扑排序+简单dp,删边的同时维护数组 f[i] (表示至少需要几学期才能学习完课程 i
当删除一条边 (uv) 时, f[v]=max(f[v],f[u]+1) ,其他操作同拓扑排序

2.Bomb(HDU5934)
强连通分量
通过引爆半径判断,对所有炮仗 u,v 判断是否 u 能够引爆 v ,如果能则建边,然后求强连通分量。
我们发现对一个强连通分量,只需要引爆其中一个就能引爆其他的,所以我们肯定取代价最小的引爆,所以我们记录每个强连通分量代价最小的炮仗,对于强连通分量 i 我们有 mincosti=minjij(costj) ,同时记录 placej=i ,这个可以在tarjan算法求强连通分量得到。
最后我们发现其实很多炮仗不用被点燃,因为会被其他点燃的炮仗引爆,所以我们只需要求出 ans=pi=0imincosti 。 统计 p[i] 时,对每一条边 (u,v) ,我们只对 place[v]!=palce[u]vp[v] 1
时间复杂度为 O(n2)

3.Wire
二分+最小生成树
二分我们需要买的规格的线的长度 len ,只选取长度小于等于 len 的边,判断是否能构造一颗生成树,如果能则说明我们还可能去的更小,否则说明 len 取得太小
若使用Kruscal算法,只需要最开始对边排序(升序),然后只取第 1 条到限制的那条边即可,而判断是否能生成树只需要 O(m) ,所以整体时间复杂度为 O(mlogm+mlogm) O(mlogm)

你可能感兴趣的:(七中高新信息学竞赛训练——2017寒假第二次练习赛题解)