图论神仙题大赏

BZOJ 3445 Roadblock

1605606-20190812235417550-1276071002.png

先跑一边最短路,然后枚举最短路上的每条边,将路径翻倍然后跑Dijstra.

因为不在最短路径上的边没用贡献,然后最短路径最长为 n−1

复杂度 O(nmlogm)

BZOJ 1579 道路升级

1605606-20190812235423921-1196348110.png

两维:k使用了多少次更新,u最短路ww咱可以跑dp?

分层图,第一层:原图,第二层内部:原图,然后从第一层点u向第二层点v连一条长度为0的边,从第二层点v再向第一层点u连一条长度为0的边。

因为有可能用不完k个,所以需要从u到u连一条长度为0的边(单向的)

BZOJ 4152 The Captain

1605606-20190812235429150-146762471.png

假设\(x_1<x_2<x_3\)那么选择\(x_3\)不如选择\(x_1->x_2\),再选择\(x_2\)\(x_3\)

按x轴排序,相邻的点建边,然后就是O(n);

按照某维坐标排序,相邻两个点在这一维度上的差值最小,所以两两连边,长度为这一维度上的差值(不用考虑另外一维度的,就算另外一维度的更小,在连另外一维度的时候也能够抵达)。然后跑最短路即可。

BZOJ 1050 旅行 COMF

1605606-20190812235438964-1463696090.png

枚举最小边,然后大概就是跑最小生成树的思路,然后找最大边

枚举最小边,用更大的边做 Kruskal,当 S 和 T 连通立即 Break。
LCT,从大到小加边维护最小生成树。

1.边按权值排序,标号1~m

2.初始化一个枚举起点sta=1

3.初始化并查集

4.从sta开始顺推,利用并查集加边,直到s与t连通

5.记录当前边编号为r

6.初始化并查集

7.从r逆推,利用并查集加边,直到s与t连通

8.得到当前边编号,记为l

9.[l,r]是一组比较优的可行解,更新答案

10.枚举起点sta变为l+1,返回第3步继续执行

bzoj 1821 部落划分

1605606-20190812235445566-1212644897.png

o(n^2)先建边,选中一条边,代表这条边所联通的点形成一个部落。

1.二分考虑,mid是最远距离,然后所有<mid的边都要在连通块内部,这个时候看是否可以建出k个连通块,如果可以,那么将mid增大,否则减小

2.kruskal选边,从小到大选取,当恰好形成了k个连通块的时候,退出循环。

把一个部落内看做连通块然后最大化所有没选中的边的值,选中n-k条边,停止算法。(那些边权比较小的形成环的边已经在并查集的时候给忽略掉了,并不影响最终答案);

BZOJ 3714 Kuglarz

1605606-20190812235451696-1806679187.png

询问ci,j实际上是在s[r]和s[l-1]连一条边,然后要将所有边和s[0]连起来,加边以后,跑最小生成树;

推知前缀和,就可以推知a的序列;

询问l,r区间,可以知道s[r]和s[l-1]奇偶性是否相同,然后奇偶性是有传递性,然后让s[0]和s[1~n]都和点0连通,最小生成树;

s[0]显然是偶的,然后如果s[1]是奇的,显然1就有小球rrr。反之没有,然后就这样推就好了???

我们想象有一个虚拟的0号盒子,其中没有小球。

比较明显的是知道[i,j]的奇偶性,等价于知道[0,j]与[0,i-1]差的奇偶性,而又由于0号的盒子的奇偶性已知,所以说只要知道[0,1]、[0,2]、...[0,n]的奇偶性,就能知道每一个盒子的奇偶性。又有:如果知道[l,k]和[k+1,r]的奇偶性,就可以得到[l,r]的奇偶性。所以。如果把一次询问[i,j]当作在图上的一条无向边(i-1,j),那么就需要让每一个节点都与0属于同一个连通块中。这样,我们就把原问题转化为了最小生成树问题。

BZOJ 4144 Petrol

1605606-20190812235457561-2101457159.png

考虑对于每个不是加油站的点,如果剩下的油>d,那么先去d'加满在回来的油量一定也>d?

1605606-20190812235501727-2035829096.png

一次dij处理出每个非加油站的点距离其最近的加油站是哪个,有多远。以所有加油站为原点,做多远最短路。

重构:对一条边,找到其左边点的最近加油站,右边点的最近加油站,然后在这两点之间连一条边r。

枚举原图的边,如果两点最近加油站不同,就将两个加油站连边,边权为两个点到最近加油站的距离和再加上这两个点的距离和,然后跑最小生成树?

1605606-20190812235513625-1419302187.png

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

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

    因为u一定从某个加油站来,设最后经过的加油站为y,u点油量为B1 = b - dis(y,u),而如果u不可以走到x一定不能走到其他任何加油站自然也到不了终点,如果可以到x加满油也一定可以再从x回来,油量为B2 = b-dis(x,u)  , 因为dis(y,u) >= dis(x,u)所以B1 <= B2 ;

    考虑重新构图:nr[x]表示离x最近的加油站,dis[x]表示x和nr[x]的距离,可以用多源点dijkstra处理出所有nr[x]和dis[x];

    对于原图中边(u,v) 连边(nr[u] , nr[v] , dis[u] + dis[v] + w(u,v)   ) ;

    这就变成了一个图,只选<=b 的边问两点连通性,可以离线或者用kruskal重构树做;

BZOJ 1880 Elaxia的路线

1605606-20190812235521187-1827909074.png

记四个关键点为 E1,E2,W1,W2。
一条边 < u, v, w > 在从 S 到 T 的最短路上,当且仅当\(D_{S,u} + w + D_{v,T} =D_{u,v}\)
找出所有同时在 E1 到 E2 和 W1 到 W2 最短路上的有向边,一定无环形成 DAG。
拓扑排序求 DAG 最长路。
注意:对于同时在 E1 到 E2 和 W2 到 W1 最短路上的有向边再做一次

BZOJ 2612 Sums

1605606-20190812235525274-1263921971.png

如果k可以被凑出来,在moda[1]意义下,所有%a[1]==k相等的都可以表示出来

设 a[1] 是最小的,在模 a[1] 意义下,0 到 a[1] − 1 每个位置都有其最小可被表示值。而如果 k 是可被表示的,那么k + a[1], k + 2 × a[1], . . . 都可被表示。故问题转化为求解每个位
置最小可被表示数字。
建立 a[1] 个点,对于每个\(a[j],j \neq1\),我们理解为可以花费a[j] 代价从 x 点转移到 (x + a[j]) mod a[1] 点。建边之后从 0号点出发做单源最短路即可。

然后我们画个图李姐一下:

1605606-20190812235532715-1774526180.png

某神仙题目rrw

1605606-20190812235538382-2007504715.png

时间复杂度\(O(QlogQ)\)

简单来说,枚举最后一个人是谁,然后将其他人取一个∪,这样就可以求出最后一个人得到的座位了wer

线性基rwr

就是集合里的数互相^不会产生0;

线性基是啥?
你可以理解为将一个序列处理完之后得到的产物,并且有如下性质(后面有证明):

  1. 原序列里面的任意一个数都可以由线性基里面的一些数异或得到。
  2. 线性基里面的任意一些数异或起来都不能得到0
  3. 线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的

然后有个题:给n个数,每个数有一个权值wi,现在求最少的权值,让其是线性基?

题目忘了,反正和kruskal的思路是一样的。

1605606-20190812235549980-610006621.png

Floyd快速幂↑

这样可以求只经过k个点的最短路rr;

如何求长度最小的负环:

Floyd求最小的k,A的k次方产生负环,然后可以像树上倍增一样处理,降低时间复杂度。

转载于:https://www.cnblogs.com/zhuier-xquan/p/11343387.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值