随笔分类 -  图论

摘要:n<=100000,m<=500000的图有点权边权,q<=500000个询问每次问从x出发经过不超过y的边权能到的点权第K大,加强版强制在线。 Emmmmmm有一个漂亮的方法来转化,就是对原图做MST,做的时候要连接两个点时不要直接连,新开一个点然后让这两个点连上这个点。 这样就把边权挂到树上了, 阅读全文
posted @ 2017-12-01 19:34 Blue233333 阅读(232) 评论(0) 推荐(0)
摘要:n<=100000的点权树,有m<=100000个询问,每次问两个点间的第k小点权,保证有解,强制在线。 主席上树啦!类似于之前的序列不带修改询问的前缀表示法,现在只要把前缀当成某点到根的信息即可。然后比如要问x点和y点,z为lca(x,y),w为z的爸爸,那么x,y,z,w四棵线段树一起跑即可。 阅读全文
posted @ 2017-11-30 07:14 Blue233333 阅读(168) 评论(0) 推荐(0)
摘要:n<=30 * m<=30 的地图上,0表示墙壁,1表示可以放箱子的空地。q<=500次询问,每次问:当空地上唯一没有放箱子的空格子在(ex,ey)时,把位于(sx,sy)的箱子移动到(tx,ty)的最小步数。 第一档:n<=10,m<=10,不加剪枝地乱搞?? 第二档:n<=30,m<=30,q< 阅读全文
posted @ 2017-11-02 10:23 Blue233333 阅读(359) 评论(0) 推荐(0)
摘要:n<=1e5的有根点权树,m<=1e5个操作:换根,修改点权,查询子树最小值。 维护子树信息--dfs序,至于换根只需要分类讨论一下现在根和查询点的关系。 如果查询的点是根节点,就输出整颗树的最小值。 如果查询的点5在1到7的路径上,那以7为根的时候查询5,就是整颗树排除粉红色部分--5的儿子中,是 阅读全文
posted @ 2017-10-19 10:55 Blue233333 阅读(498) 评论(0) 推荐(0)
摘要:n<=500条边的图,求:最少设置多少关键点,使得当任意某一个点不能经过时其他点都至少能到达一个关键点,并输出方案数。 tarjan求点双,如果一个点双里面没有割点,那这就是一个孤立的点双分量,至少要设置两个点。如果有割点,大概是这样的情况: 红色的这些“叶子”分量,也就是只有一个割点的分量,是一定 阅读全文
posted @ 2017-10-14 08:28 Blue233333 阅读(355) 评论(0) 推荐(0)
摘要:n<=1e5个点的树有边权,m个询问,每次问max dis(i,j) a<=i<=b,c<=j<=d。 结论:一个区间的最远点对,要么是其左半区间的最远点对,要么是其右半区间的最远点对,要么是左右半区间最远点对的四个点的互相组合之一。如下图: 两个集合最远点对分别是A-B,A并B的最远点对是红A-蓝 阅读全文
posted @ 2017-10-10 22:08 Blue233333 阅读(444) 评论(0) 推荐(0)
摘要:求三个人从a,b,c这三个位置跳到x,y,z最少多少步。跳:任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。 从它跳的性质出发,向内跳只有一种操作,而向外跳有两种。这就是说,每个状态可以找到一个唯一前趋,有两个后继。这是一棵二叉树!求两个状态的最短路就是求他们到l 阅读全文
posted @ 2017-10-10 08:11 Blue233333 阅读(348) 评论(0) 推荐(0)
摘要:n<=300个点的有向图求点数最少的负环。 先倍增,用floyd找到最少出现负环的走2^k的最短路,把倍增过程中那些图记下来。倍增floyd就跟矩阵快速幂一样的,因为:把floyd当成一次乘法,走一步的图*走一步的图=走两步的图,走两步的图*走两步的图=走四步的图…… 不过有个小问题,走3步出现负环 阅读全文
posted @ 2017-10-08 08:19 Blue233333 阅读(372) 评论(1) 推荐(1)
摘要:n<=100000个点m<=100000条边有向图,有一次机会沿着某条边反方向走一次,求从一号点出发最终到达一号点的路径经过的不同的点的数量的最大值。 tarjan缩完点,如果没机会反方向的话答案就是1所在的分量的大小。现在有了,其实就是1->1能到达的某个点->反向边->能到达1的某个点,所以只要 阅读全文
posted @ 2017-09-28 08:00 Blue233333 阅读(186) 评论(0) 推荐(1)
摘要:n<=50000的树,深度<=100,有点权,选两个点x,y,使最小。 dis取了min之后,整个树就会以某条边为分界线分成两半,一半归一个点管。如果是两棵完全独立的树的话,那肯定分别取这两棵树的带权重心。但割掉某条边再找两边重心,这种情况不一定是合法情况。例如: 上图中,虚线边被断开,两边的重心分 阅读全文
posted @ 2017-09-27 15:01 Blue233333 阅读(438) 评论(0) 推荐(0)
摘要:n<=100 * m<=100的地图,每个数绝对值不超过25,从1,1到n,m,一开始速度v,从数字A走到数字B速度会变成v*2^(A-B),求到终点最短时间。 可以发现,相同的数字出发的速度是一样的,和(1,1)位置的数的差做2的指数再乘v,而一个点只有四条边,跑个最短路即可。 然后n,m打反调了 阅读全文
posted @ 2017-09-19 13:41 Blue233333 阅读(273) 评论(0) 推荐(0)
摘要:n<=200个点m<=40000条边无向图,求 t次走不经过同条边的路径从1到n的经过的边的最大值 的最小值。 最大值最小--二分,t次不重边路径--边权1的最大流。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #i 阅读全文
posted @ 2017-09-18 13:55 Blue233333 阅读(401) 评论(0) 推荐(0)
摘要:最短路模板。选迪杰。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 #include<queue> 6 //#include<iostream> 7 using namesp 阅读全文
posted @ 2017-09-14 21:12 Blue233333 阅读(243) 评论(0) 推荐(0)
摘要:n<=200个点m<=1500条无向带权边的图,每个点有人和容量,人可以移动,代价为所有人走过的边的权和,求使所有点人不超过容量的最小代价。 方法一:费用流。 错误!答案与边权不成比例。 方法二:二分一个答案,然后根据floyd求出的最短路看每个点在二分的答案下能去到哪些点,跑最大流检查是否合法。 阅读全文
posted @ 2017-09-14 19:10 Blue233333 阅读(252) 评论(0) 推荐(0)
摘要:n<=50 * m<=50的地图,每块地‘*’表示一定要被填上,‘.’表示一定不能填上,用1*l或l*1,l自定,的板填起来,求最少几块板。 如果是做过那种“一炮打一列或一行,求几炮把地图上的点打掉”的二分图经典题,那就可以类比了。不过这里的行和列是基于联通块的,所以预处理出行联通块和列联通块并编号 阅读全文
posted @ 2017-09-13 14:00 Blue233333 阅读(208) 评论(0) 推荐(0)
摘要:n<=500 *n的格子,给m<=10000个格子有人,一炮可以清掉一行或一列的人(莫名的爽!)求最少几炮干掉所有人。 经典二分图模型!行成点,列成点,一个点就连接一行一列,表示这一行或这一列必选其一! 不喜欢匈牙利!跑网络流! 1 #include<stdio.h> 2 #include<stri 阅读全文
posted @ 2017-09-05 21:26 Blue233333 阅读(182) 评论(0) 推荐(0)
摘要:n<=250个点m<=10000边无自环图,有点权边权,Q<=10000个询问i到j的最短路。这里的路径长度指路上边权和+路上点权最大值。 n这么小,询问这么多,那就跑跑floyd吧!f[i][j]记最短路,g[i][j]记最短路上最大点权,当f[i][j]+g[i][j]>f[i][k]+f[k] 阅读全文
posted @ 2017-08-30 13:43 Blue233333 阅读(202) 评论(0) 推荐(0)
摘要:n<=25000个点m1<=50000条正权无向边m2<=50000条正负权有向边,保证有向边连接的无向边联通块形成一个拓扑图,求从s到每个点最短路。 第一次发现不会最短路。没看题乱写迪杰无脑WA,很好。迪杰从来不能处理负权最短路,然后就开始啃题解。。http://www.cnblogs.com/s 阅读全文
posted @ 2017-08-29 22:07 Blue233333 阅读(264) 评论(0) 推荐(0)
摘要:n<=100000个点的树,每个点属于一个K<=n/2个集合中的一个,每个集合至少两个点,求每个集合中任选两点距离的最大值。 方法一:什么都看不出来,点分,每次只统计经过一个点的每个集合的不同子树的路径来更新。详见http://www.cnblogs.com/Enceladus/p/6099250. 阅读全文
posted @ 2017-08-29 16:01 Blue233333 阅读(223) 评论(0) 推荐(0)
摘要:n<=1000个数,从小到大,给m1<=10000条描述两个数相差不超过多少,m2<=10000条描述两个数相差至少多少,求1到n最大距离,无解-1无穷大-2。 裸的差分约束,spfa判负环。 差分约束口诀!大小短,小大长!(最大值,用≤式子,写最短路,后面同理) 1 #include<stdio. 阅读全文
posted @ 2017-08-28 18:39 Blue233333 阅读(155) 评论(0) 推荐(0)