图论刷题(cf2400+)

1292D. Chaotic V.

调整法的思想,初始化汇点为1号点,动态调整往子树大小超过一半的那个子树移动才能使得ans减少,一直移动直到ans不再减少。因为点数很多,不能显式建图,每次动态维护好下一层的子树即可。会在同一子树中的点当前最大质因子必须相同,只要维护好当前最大质因子即可。然后不在该子树中的点可以直接丢弃,不用维护。每次维护的复杂度是5000,移动至多走到一个叶节点上,至多移动5000log5000步,因此复杂度为5000*5000log5000。

1198E. Rectangle Painting 2

比较经典的模型,假设h < w,如果用一个h*w的网格来覆盖那么不如拿h*n的来覆盖,h*n的还不如拿h个1*n的来覆盖,因此一个格点(x,y)要被覆盖相当于
x和y至少有一个维度被覆盖,那么相当于一个二分图,左半边n个点为x,右半边n个点为y,每个点的点权都为1,一个格点相当于一条边x->y,就转换成二分图最小点覆盖问题,最小点覆盖=最大匹配,这道题数据加强了一点n是1e9,格点也变成一个矩阵,需要进行区间离散化,一个矩阵横坐标的区间拆成q个区间来代表,纵坐标的区间拆成p个区间,一个矩阵即为q*p个格点,因为现在二分图上每个点代表离散化后的区间,因此点权为区间大小,需要用dinic跑最小割。

1307F. Cow and Vacation

加入u能到达v,那么一定满足两种情况中的一种,一种是u和v直接的距离小于等于k,不需要经过休息点,一种是u->一系列相互可到达的休息点->v。第一种情况就直接用lca求两点间距离即可判断,第二种情况,需要先维护一下哪些休息栈相互可达,用并查集和bfs,这些休息站作为起点进行bfs,距离一个休息站小于等于k/2的点必定可以达到该休息站,那么距离该点小于等于k/2的休息站一定相互可达,k可能是奇数,将一条边中间加个点拆成两条边,那么现在最长不经过休息站可行走的距离为2k,那么相当于距离该点小于等于k的休息站相互可达,这样便可以维护好一些集合,集合中的点都是相互可达的并且距离最近的休息站小于等于k,在新图上u和v的距离大于2k,如果u和v能否互相到达,那么u到v直接必定存在一段路径,该路径上点直接可以借助休息站相互可达,等价于u向v走k步,v向u走k步,此时两点如果再一系列相互可达的点中,那么u和v必定相互可达。

1253F. Cheap Robot

因为起点和终点都是充电站,假设存在最优路径 a − > p 2 − > p 3 − > . . . > p x > b a->p2->p3->...>p_x>b a>p2>p3>...>px>b,经过s个充电站,那么可将该路径划分成s - 1段,此时电池的最小容量为这s - 1段路径中的最大值。那么可以将中间点直接屏蔽掉,两个充电站之间转移一定走最短路径,如果能求出前k个点的最小瓶颈树,那么问题就解决了。设一个点u距离最近的充电站为 t u t_u tu,距离为 d u d_u du,假设现在位于点u,剩余电量为x,那么可以得出 x < = c − d u x<= c - d_u x<=cdu,最优情况下就是从最近的充电站转移过来的,如果此时 x < d u x < d_u x<du ,那么一定不成立,因为走不到任何充电站,而终点也是充电站,如果 x > = d u x >= d_u x>=du ,那么可以直接走向最近的充电站充电,再走回来,那么 x = c − d u x = c - d_u x=cdu为到达该点能剩下的最大电量。那么如果一条边u->v为最优路径上的点,那么一定满足 c − d u − w > = d v c - d_u - w>= d_v cduw>=dv,得到 d u + d v + w < = c d_u + d_v + w <= c du+dv+w<=c,那么可重建新图,原图中的边 ( u , v , w ) (u,v,w) (u,v,w),变成 ( t u , t v , w + d u + d v ) (t_u,t_v,w + d_u + d_v) (tu,tv,w+du+dv)。可以证明原图上的最优路径在新图上一定可以找到。
假设原图上a->b最优路径上有一条边u->v,那么等价于 u − > t u − > t v − > v u->t_u->t_v->v u>tu>tv>v,那么将等价路径中的 t u − > u − > t u t_u->u->t_u tu>u>tu去掉也是等价的,那么该路径上的点只剩下充电站,所有的这样的边都在新图上可以找到。
那么现在相当于在新图上求得最小瓶颈树,就转换成a->b路径上求最权最大值的问题。

F. Upgrading Cities

考虑不满足要求的点,超过一个点不可到达,满足要求的点至少要有n-2个点可达(或者可被到达),对于DAG来说,拓扑排序的过程中,队列中的元素必定都是互不可达的,如果队列里面超过两个元素,那么队列中的点必定不符合要求,如果只有一个点,那么剩下的所有点必定是可到达的,如果队列中恰好有两个点x,y,如果y的所有直接到达的点,存在入度为1的点v(只能y到达),说明x也必定不符合要求,直接标记掉即可,否则剩下的点x一定都可达。正反跑两边拓扑,对于每个没被标记的点计算可到达(或者可被到达)的点的数量,大于等n-2即可。

F. Robots on a Grid

每个点只有一个出度,因此必定将图分割成若干个连通块(也可能一个),每个联通快必定存在一个简单回路,最大机器人数量,就等于每个联通快中环的长度相加,而黑色格子之间可能存在冲突,比如多个分支的机器人同时进入环,或者分支上的机器人走到环,和环上的机器人相遇,出现冲突就是他们进环的步数相同,那么随便环上找个点,反向搜索一遍,计算出每个点到改点的距离,距离相同的多个黑色格子只能选择一个,统计一下即可。

L. Road Construction

n个点n条边联通图,必定是个基环树,要求选中若干条边使得整个图联通。可以把边分成两种,一种在环上,一种不在环上。不在环上的必选,环上假设有x条边,那么选中x-1条即可。不在环上的直接连向汇点流量为1,在环上的连到一个中间点,流量为1,中间点流向汇点流量为x-1即可。再从源点连向每种颜色,流量为对应的工人个数,颜色连向所有可以建造的边,流量为1,跑一遍最大流即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值