图论icpc多校真题
文章平均质量分 51
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
牛客练习赛67 E.牛妹游历城市(最短路优化连边,分层)
传送门 不错的一题 如果暴力考虑O(n2)O(n^2)O(n2)的连边是行不通的 然后第一下想法是去找找规律,看看这么连边是否有什么性质,结果也没找到 于是想到需要优化连边 优化连边常用的方法就是利用边的共性建立虚点 从虚点处中转达到减少边的效果,这题也是如此 我们直接按位连边,向对应的323232连边,费用为1<<i1<<i1<<i 这样a−>ba->ba−>b的路径转化为a−>2k−>ba->2^k->ba−>2k−&g原创 2021-02-07 12:19:35 · 272 阅读 · 0 评论 -
P3714 [BJOI2017]树的难题(点分治+线段树合并)
传送门 这题做的我晕乎乎的,下次再来仔细理解 主要想法是找重心点分治,搜索出从重心开始的所有路径 如何合并路径是关键 对于长度为lenlenlen的路径,我们需要找到路径长在[l−len,r−len][l-len,r-len][l−len,r−len]中路径的最大值 但是简单的合并就好了吗?? 不是的,如果两条路径的连接处颜色相同,还需要减掉一次这种颜色的贡献 那么我们把重心的儿子存下来,按照颜色大小排序,依次搜索 这样相同的颜色路径是集中在一起被处理的 我们维护两颗线段树,都是以路径长度为下标 第一颗存与原创 2021-02-03 11:20:29 · 316 阅读 · 1 评论 -
牛客练习赛60 E.旗鼓相当的对手(启发式合并)
传送门 考虑把每个点拿出来单独计算 假如树型dpdpdp怎么写?? 定义dep[x]dep[x]dep[x]为深度为xxx的个数,w[x]w[x]w[x]为深度xxx节点的权值和 那么新假如一棵子树时,每个点都可能和之前子树的节点形成kkk路径的lcalcalca 因为deep[u]+deep[v]−2∗deep[lca(u,v)]=kdeep[u]+deep[v]-2*deep[lca(u,v)]=kdeep[u]+deep[v]−2∗deep[lca(u,v)]=k 所以得到子树中满足条件的节点深度是d原创 2021-01-28 16:21:11 · 273 阅读 · 0 评论 -
HDU3830 Checkers(思维隐式建图+数学lca)
传送门 题意 给定三元组(x,y,z)(x,y,z)(x,y,z) 每次可以从x,y,zx,y,zx,y,z任选一个作为对称轴,其余数字可以根据这个对称轴跳到另一侧 规则是不能跨越两个数字 给你两个三元组,判断最短操作步数. 分析\color{Red}分析分析 这题思路是真的隐蔽… 首先对于三元组(x,y,z)(x,y,z)(x,y,z) 首先yyy可以跳到xxx左侧,也可以跳跃到zzz右侧,这是毫无疑问的 然后,当y−x<z−yy-x<z-yy−x<z−y时,xxx可以跳到yyy右边,因原创 2020-11-30 22:27:25 · 258 阅读 · 0 评论 -
HDU 4005 The war(边双连通+思维树型dp)
传送门 题意 给定一张 n 个点 m 条边的无向连通图 加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 −1。 首先环内的边删去没有用处,所以边双连通缩成一棵树 那么在树上两点连接,路径上的边都不是桥了 问题转化为,在树上选择一条链,使得其余边的最小边权最大. 那么树上的最小边一定在链上 那么这棵树被这条特殊边分成两棵树,可以分别以边的两端向下延伸 而且每到一个点,维护向下走的最小值和次小值 那么这条路径最多覆盖最小值,次小值不可避免,取minminmin即可 #include &原创 2020-11-24 13:11:40 · 255 阅读 · 0 评论 -
Poj 3613 Cow Relays(floyd的矩阵快速幂)
传送门 非常nbnbnb的一道题 假如求方案数,那么可以定义f[i][j]f[i][j]f[i][j]为iii次到jjj的方案数 可以得到f[i+1][v]+=f[i][j]f[i+1][v]+=f[i][j]f[i+1][v]+=f[i][j] 所以可以以01邻接矩阵作矩阵快速幂得到方案数. 然后这里的权值也是同样的道理 假如现在得到了经过xxx个点的最短路,求经过x+yx+yx+y个点的最短路 那么只需要有经过yyy个点的最短路即可 这样加起来就经过了x+yx+yx+y个点 所以把邻接矩阵同时作为初始矩原创 2020-11-23 21:02:29 · 232 阅读 · 0 评论 -
HDU 3873 Invade the Mars(灵活的dijstra魔改)
传送门 给定一张图,求111到nnn的最短路 进入到第iii城市当且仅当所有iii的子城市都被进入 而且由于从111出发的是一个军队,所以占领城市可以同时进行 非常灵活的一题…对于dijstradijstradijstra的魔改 因为每个点是有限制的,不能马上入队,只有当不受任何城市保护了才能入队更新别人 记录一下每个点还受多少点保护in[i]in[i]in[i],以及每个点保护了哪些点 那么每次从优先队列拿出一个不受保护的点uuu 所有受到点uuu保护的点的in[i]−−in[i]--in[i]−− 且原创 2020-11-19 21:06:51 · 303 阅读 · 0 评论 -
HDU6735 Sparse Graph(set优化补图bfs)
HDU传送门 补图边非常多,不可能把所有边加上去跑最短路 但是这里边权非常特殊只有111,换句话说可以bfsbfsbfs让每个点只更新一次 现在重点就是优化bfs了 怎么快速找到那些和自己没边而且没有被更新的点呢? 维护两个集合s1,s2s1,s2s1,s2 s1s1s1放还没有被更新的点 那么扫描一遍和点uuu相连的点vvv 如果在s1s1s1里面,就从s1s1s1抹掉,再加入s2s2s2 这样下来的话.s1s1s1的点都是点uuu可以更新的点 s2s2s2的点都是点uuu不能更新的点,而且还没有更新 每原创 2020-11-03 20:06:23 · 253 阅读 · 0 评论 -
ECfinal 2019 E. Flow(假流真贪心)
Flow 叫flow结果和流没一点关系… 很坑,题意理解了半年 注意一句话叫做图G是从1到n由相同长度的不相交路径组成的图G是从1到n由相同长度的不相交路径组成的图G是从1到n由相同长度的不相交路径组成的 意味着如果一条111到nnn的路径是xxx,所以的路径都是长xxx 知道这个有什么用呢???显然可以计算得到最大流是k=∑flowxk=\frac{\sum flow}{x}k=x∑flow 其中flowflowflow表示边权 那么如果跑最大流,每条路径都会因为最小边限制流量 就算你给最小边拼命灌输流原创 2020-10-03 20:34:05 · 674 阅读 · 0 评论 -
HDU4332 Candy(经典贪心拆边费用流)
链接传送门 2012年多校的一道费用流,令人叹为观止的贪心建图思想 首先一块糖果给不同人的收益是不同的,所以考虑费用流而不是最大流 然后就不会做了… 发现糖果要么贡献价值kkk,要么贡献价值111 如果我们让尽量多的糖果贡献价值kkk,是不是意味着最优呢? 大概是这样,但也不全是,因为有的人会溢出收益 考虑某个人的bib_ibi,如果bi%k==0b_i\%k==0bi%k==0,那么他最多能吃掉bi/kb_i/kbi/k个喜欢的糖果 那么这个人向汇点连一条流量bi/k,费用k的边那么这个人向汇点连一原创 2020-09-29 16:36:41 · 233 阅读 · 0 评论 -
HDU多校6821A Very Easy Graph Proble
确实是一个非常简单的问题… 首先很容易看出边的权值是很特殊的 换而言之,就算把[1,i−1][1,i-1][1,i−1]条边走个遍,也比走第iii条边划算 所以我们想到建立最小生成树,因为一旦边权小的把两个点连起来 一定是最优的,后面的边加进来对这两点没有影响 所以就变成了求树上任意两异色点距离和所以就变成了求树上任意两异色点距离和所以就变成了求树上任意两异色点距离和 可以算每条边的贡献,计算左右两边的白黑点对,相乘即可可以算每条边的贡献,计算左右两边的白黑点对,相乘即可可以算每条边的贡献,计算左右两边的白原创 2020-09-17 21:24:15 · 224 阅读 · 0 评论 -
HDU6598多校Harmonious Army(文理分科类最小割)
标准的文理分科模型 如果没做过,建议尝试一下这题文理分科 #include <bits/stdc++.h> using namespace std; #define int long long const int maxn=2e5+10; const int inf=1e18; struct edge{ int to,nxt,flow; }d[maxn];int head[maxn],cnt=1; int n,m,s,t,maxflow; void add(int u,int v,int f原创 2020-09-17 20:01:34 · 240 阅读 · 0 评论 -
牛客2019多校第五场maximum clique 1(隐含二分图最大团)
以前还是对最大独立集之类的东西概念混淆不清,搞得我看了很久… 要求找出最大团,使得任意两个数二进制至少有2位不同 这是个二分图. 我们按照二进制1的奇偶性可以分为两个集合我们按照二进制1的奇偶性可以分为两个集合我们按照二进制1的奇偶性可以分为两个集合 若同为为奇数(或偶数),不管怎么构造,都至少有2位不同若同为为奇数(或偶数),不管怎么构造,都至少有2位不同若同为为奇数(或偶数),不管怎么构造,都至少有2位不同 因为数字互不相同,所以即使1的个数相同,也会有2位不同因为数字互不相同,所以即使1的个数相同,也原创 2020-09-16 23:56:50 · 709 阅读 · 0 评论 -
多校HDU 6805 Deliver the Cake (拆点最短路)
做多了网络流这种题不都是板子题目么… 每个村庄可能有两个状态左和右 所以可以拆点,把每个点拆分为左村和右存 连边的时候,枚举当前村是左是右,把所有边都连上去 如果是左到右或右到左花费加上xxx即可 我感觉我的代码写的够清楚了,不多累赘了 [1,n][1,n][1,n]表示左村 [n+1,2n][n+1,2n][n+1,2n]表示右村 #include <bits/stdc++.h> using namespace std; #define int long long const int maxn原创 2020-09-16 21:56:23 · 242 阅读 · 0 评论 -
HDU4888 Redraw Beautiful Drawings(最大流唯一解)
这个dfs找环坑了我好久… 模型非常明显 行iii向列jjj连一条流量kkk的边,表示(i,j)(i,j)(i,j)格子的取值范围 然后源点连向每一行,流量为行和 每一列连向汇点,流量为列和 假如是最大流,那么就能匹配成功 但是怎么去判断是不是唯一解 结论是,如果残量网络有点数大于2的环,就可以有其他解 因为改变一个格子的数字,对于这行来说需要有另一个对应的格子减少数字 对应列来说也需要对应的格子减少数字 在找到那个可以减少的数字后又会出现确实,需要加数字… 但如果出现环,就可以弥补这个循环 #includ原创 2020-09-14 21:42:26 · 240 阅读 · 0 评论 -
2019HDU多校 Path(最短路转最小割)
HDU6852 之前见过类似的题,所以写起来很轻松 因为要让最短路边长,所以可以先跑最短路 满足dis[u]==dis[v]+d[i].wdis[u]==dis[v]+d[i].wdis[u]==dis[v]+d[i].w的边就是最短路边 这些最短路边形成一张网络 在上面跑最小割,代表的就是割断每一条最短路 #include <bits/stdc++.h> using namespace std; #define int long long const int maxn=4e5+10; con原创 2020-09-14 18:47:00 · 211 阅读 · 0 评论 -
(2020多校)H.Minimum-cost Flow(费用流的增广路)
传送门看这里吧 这题没有考察建图,而是考察费用流的本质。 比如每次spfa只会找一条增广路 比如越先找到的增广路花费一定越小 首先发现容量为u/v是没办法算的(分数)首先发现容量为u/v是没办法算的(分数)首先发现容量为u/v是没办法算的(分数) 边容量u/v,最大流是1边容量u/v,最大流是1边容量u/v,最大流是1 转化为边容量u,最大流是v(这样花费最后要除以v)转化为边容量u,最大流是v(这样花费最后要除以v)转化为边容量u,最大流是v(这样花费最后要除以v) 面对这么多询问,我们预处理一下每条增原创 2020-08-23 11:42:04 · 300 阅读 · 0 评论