zoukankan      html  css  js  c++  java
  • 图论神仙题大赏

    BZOJ 3445 Roadblock

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

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

    复杂度 O(nmlogm)

    BZOJ 1579 道路升级

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

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

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

    BZOJ 4152 The Captain

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

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

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

    BZOJ 1050 旅行 COMF

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

    枚举最小边,用更大的边做 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 部落划分

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

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

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

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

    BZOJ 3714 Kuglarz

    询问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

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

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

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

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

    首先注意到起点和终点都是加油站;
    
        假设中途经过某个非加油站的点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的路线

    记四个关键点为 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

    如果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 eq1),我们理解为可以花费a[j] 代价从 x 点转移到 (x + a[j]) mod a[1] 点。建边之后从 0号点出发做单源最短路即可。

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

    某神仙题目rrw

    时间复杂度(O(QlogQ))

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

    线性基rwr

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

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

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

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

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

    Floyd快速幂↑

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

    如何求长度最小的负环:

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

  • 相关阅读:
    Eclipse SVN忽略某些文件或文件夹方法
    在ORACLE中给已有数据的表增加、修改、删除一个字段(或一个列)或者多个字段(或多个列)的问题
    Java中IO流,输入输出流概述与总结
    Java面向对象之继承
    jquery-each()
    window.showModalDialog以及window.open用法简介
    struts1、ajax、jquery、json简单实例
    软件人才管理
    疑难杂症定位记录
    linux中断子系统
  • 原文地址:https://www.cnblogs.com/zhuier-xquan/p/11343387.html
Copyright © 2011-2022 走看看