NOIP2024集训Day53 图论

NOIP2024集训Day53 图论


A. [BZOJ4144 AMPPZ2014] Petrol

首先注意到起点和终点都是加油站。

假设中途经过某个非加油站的点 \(u\)\(u\) 连到 \(v\),离 \(u\) 最近的加油站是 \(x\),那么从 \(u\)\(x\) 加油后回到 \(u\),再到 \(v\) 一定不比直接从 \(u\)\(v\) 差。

因为 \(u\) 一定从某个加油站来,设最后经过的加油站为 \(y\)\(u\) 点油量为 \(A = b - dis_{y, u}\),而如果 \(u\) 不可以走到 \(x\) 一定不能走到其他任何加油站自然也到不了终点,如果可以到 \(x\) 加满油也一定可以再从 \(x\) 回来,油量为 \(B = b - dis_{x,u}\), 因为 \(dis_{y, u} \ge dis_{x, u}\) 所以 \(A \le B\)

考虑重新构图:\(p_x\) 表示离 \(x\) 最近的加油站,\(dis_x\) 表示 \(x\)\(p_x\) 的距离,可以用多源最短路处理出所有 \(p_x\)\(dis_x\)

对于原图中边 \((u,v)\) 连边 \((p_u , p_v , dis_u + dis_v + w(u,v))\)

这就变成了一个图,只选 \(\le b\) 的边问两点连通性,可以离线或者用 Kruskal 重构树做。


B. [BZOJ4423 AMPPZ2013] Bytehattan

对偶图课件

由于删边不好维护,所以将平面图转化为对偶图。

这样在平面图上删边相当于在对偶图上加边,在平面图上是否联通转化为在对偶图上是否不连通。

类似于平面图的最大流转化为对偶图的最短路。

然后用并查集维护一下就好。


D. [CCO2021] Travelling Merchant/商旅

先考虑 \(-1\) 的情况。显然没有出边的点是 \(-1\),把这样的点和对应的边删掉,直到每个点都有出边。

容易发现被删掉的点都是 \(-1\),其余的都不是 \(-1\)

对于剩下的边,\(r_i\) 最大的边如果走了,那么其它的边可以随便走,所以对应的 \(+p_i\) 没有意义。可以直接删掉这条边,然后在起始点 \(a_i\) 打上 \(r_i\) 的标记表示到达这里后资产 \(\ge\) 标记可以直接结束。

删掉边后 \(a_i\) 可能就没有出边了,也就又回到了 \(-1\) 的情况。

每个点的标记就是答案。

关键在于 逆向思维归纳法。顺着做很困难,但是从结束时的边入手则很简单。每次删除一条边归纳下去也是关键。


E. [JOI2017 Final] Soccer/足球

观察几个性质:

  1. 一个人最多控一次球(至少进行了传球或者带球);

  2. 一个人的路线一定是(无球跑动 \(\rightarrow\))(带球 \(\rightarrow\))传球/带球(带括号表示非必选项);

那么当一个球停在了位置 \((x,y)\),那么在某种最优解中,移动至 \((x, y)\) 并继续控球的一定是离 \((x, y)\) 曼哈顿距离最小的一个。

那么我们可以把一个位置 \((x, y)\) 拆点:(设总点数为 \(m\)

设为 \((x,y)_k\)\(k\in{0,1,2,3,4,5}\)

其中,\((x, y)_4\) 表示球到了 \((x, y)\),且没有人控球状态小最小疲惫值;\((x, y)_5\)表示球到了 \((x,y)\),且有人在控球状态下的最小疲惫值;\((x,y)_{0,1,2,3}\) 分别表示球正在向上下左右滚动状态下的最小疲惫值。如此一来,我们就可以建图跑最短路。

其中有一个代价,就是一个人传球时,代价为 \(a\times p+b\)\(a,b\) 是常数,\(p\) 是传球的距离),此时我们把 \(a\times p\)​ 的贡献分配到每条边上,\(b\) 的话也是可以分配到某条边上的。

最终跑一个 Dijkstra 最短路即可。


F. [COI2012] TRAMPOLIN

建立一个传送点,然后变成某个点开始的种类最长路。但是存在环,所以我们可以缩点。

然后记忆化 dfs 或者拓扑即可。


posted @ 2024-10-17 17:11  Leirt_Abu  阅读(16)  评论(0)    收藏  举报