随笔分类 -  2.————图论————

摘要:我们先不会就二分一下答案,设它是x,我们要判断它能不能满足 为了满足这个答案,我们就要让原本路径长度大于x的所有路径都经过某条边,而且这条边还要大于等于最长的路径-x 于是运用树上差分的思想,对于所有长度>x的路径,给他的两端点处++,lca处--,这样统计树上每个点的子树的和,就是这个点与它父节点 阅读全文
posted @ 2018-09-25 21:29 Ressed 阅读(183) 评论(0) 推荐(0)
摘要:我们都做过一道题(?)货币兑换,是用cdq分治来解决不单调的斜率优化 现在它放到了树上.. 总之先写下来dp方程,$f[i]=min\{f[j]+(dis[i]-dis[j])*p[i]+q[i]\} ,j是i的祖先,dis[i]-dis[j]<=l[i]$ ,其中dis[i]表示1号点到i号点的距 阅读全文
posted @ 2018-09-24 18:32 Ressed 阅读(220) 评论(0) 推荐(0)
摘要:经过部分分的提示,我们可以把一条路径切成s到lca 和lca到t的链 这样就分为向上的链和向下的链,我们分开考虑: 向上:如果某一个链i可以对点x产生贡献,那么有deep[x]+w[x]=deep[S[i]],而且S[i]和lca[i]都在x的子树中 向下:如果某一个链i可以对点x产生贡献,那么有d 阅读全文
posted @ 2018-09-24 18:04 Ressed 阅读(246) 评论(0) 推荐(0)
摘要:首先floyd求出每两点间的距离(注意自己到自己的距离要设成0) 然后就是dp了 一开始照着Lifeguards的样子,钦定了一下i这个点一定要选,然后发现复杂度不对,还想了好长时间优化 然后一翻题解,直接两种状态选或不选分开算O(1)转移多好(所以年轻人不要整天满脑子都是钦定钦定的) 但为什么Li 阅读全文
posted @ 2018-09-24 17:47 Ressed 阅读(211) 评论(0) 推荐(0)
摘要:按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小。离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的高度值 阅读全文
posted @ 2018-09-20 16:25 Ressed 阅读(185) 评论(0) 推荐(0)
摘要:我们是想跑最短路的 我们有两种建图方式: 1.对于每个doge i,连向B[j]==B[i]+P[i]*k ,k=..,-2,-1,0,1,2,... ,边权=|k|,这样连的复杂度是$O(N\sum\limits_{i=1}^{m}\frac{1}{P[i]})$ 2.对于每个楼i,建max(P[ 阅读全文
posted @ 2018-09-14 21:11 Ressed 阅读(269) 评论(0) 推荐(0)
摘要:N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几个环上不能选相邻的点,最大的价值和 我们把这个环从N到1处断开,然后钦定一下1选还是不选,统计一下答 阅读全文
posted @ 2018-09-14 20:44 Ressed 阅读(152) 评论(0) 推荐(0)
摘要:点分治。WA了一万年。 重点就是统计答案的方法 做法一(洛谷AC bzojWA 自测WA): 做点x时记到x距离为k的边数最小值为dis[k],然后对每一对有值的dis[i]和dis[K-i],给ans[A[i]+A[K-i]]++,然后因为统计到了一部分不合法答案,就做x的儿子,给ans变成--, 阅读全文
posted @ 2018-09-14 20:33 Ressed 阅读(266) 评论(0) 推荐(0)
摘要:发现对于某一个点它向上发的一条边,它被经过的次数就是这个点子树数量*不是它子树的数量 那就维护一个前缀和,然后每次拿两个端点和它们的lca的值加一加减一减,再乘上加上的值,就是这次修改后答案的增量 (最后答案还要除以(N*N)) 倍增会被卡空间,难受 阅读全文
posted @ 2018-09-13 23:16 Ressed 阅读(291) 评论(0) 推荐(0)
摘要:用一个差分树状数组维护一下每个深度的和,然后每次拿着路径端点和lca加一加减一减就行了 阅读全文
posted @ 2018-09-13 23:06 Ressed 阅读(197) 评论(0) 推荐(0)
摘要:我想动某个点的话,一定要先把空白点移动到这个点旁边,然后调换这个点和空白点,一直重复 那么,我们就可以记一些状态(x,y,s) (s={0,1},{0,-1},{1,0},{-1,0}),表示我要动的点在(x,y),然后空白点在(x+s.x,y+s.y) 这样的话我们就可以建图:$(x,y,s)-1 阅读全文
posted @ 2018-09-12 20:22 Ressed 阅读(237) 评论(0) 推荐(0)
摘要:先求出某一段时间[i,j]一直用同一个路径的最短路,乘上天数,记作cost[i,j] 那就可以设f[i]是前i天的最小代价,f[i]=f[j]+cost[j+1,i]+K 阅读全文
posted @ 2018-09-12 12:53 Ressed 阅读(135) 评论(0) 推荐(0)
摘要:https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对于某两个(直上直下的)路径a,b,b的下端点在a的下端点子树中,且b的上端点深度<=a的上端点深度, 阅读全文
posted @ 2018-09-11 16:37 Ressed 阅读(223) 评论(0) 推荐(0)
摘要:平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权。 然后从刚才加的s->t分割出来的两面对应的两个点跑最短路,求出来的就是s到t的最小割。 要特判n==0||m==0的情况 然后我特判的那个点就T了一万次,在抄eli 阅读全文
posted @ 2018-09-07 13:18 Ressed 阅读(206) 评论(0) 推荐(0)
摘要:求次短路,dijkstra时同时记下到某点的最短距离和次短距离即可。 阅读全文
posted @ 2018-09-06 16:55 Ressed 阅读(176) 评论(0) 推荐(0)
摘要:二分答案建图,然后判环,就可以了。 字典序输出的话,只要做拓扑序的时候用优先队列来维护就可以了。 (其实判环也可以用拓扑序...) 阅读全文
posted @ 2018-09-03 21:38 Ressed 阅读(177) 评论(0) 推荐(0)
摘要:tarjan缩点后,第一问答案显然是入度为零的点得个数第二问:考虑到 没有入度或出度为0的点 的图强连通, 所以答案就是max{入度为零的个数,出度为零的个数} (把出度为零的连到入度为零的点,然后剩下为零的随便连一连就可以) 阅读全文
posted @ 2018-08-02 20:16 Ressed 阅读(176) 评论(0) 推荐(0)
摘要:tarjan缩点,然后按照拓扑序,做1号点能到达的点的答案具体做法是对每个点记一个min[i],max[i],vis[i]和ans[i]做拓扑序的时候,假设在从u点开始做,有边u到v,如果vis[u]=1,则则 vis[v]=1(初始时vis[bel[1]]=1); 更新在v点及以前买进的最小进价: 阅读全文
posted @ 2018-08-02 20:10 Ressed 阅读(308) 评论(0) 推荐(0)
摘要:缩完点后对每次询问做dijkstra即可 阅读全文
posted @ 2018-08-02 20:07 Ressed 阅读(162) 评论(0) 推荐(0)
摘要:题意:给一个有向图,问要从0号点能到达所有点所需要经过路径的最小权值和是多少,然而,若两点强联通,则这两点互相到达不需要花费。保证0号点能到达所有点 tarjan缩点以后直接取每个点入边中花费最小的即可。 阅读全文
posted @ 2018-08-02 20:03 Ressed 阅读(240) 评论(0) 推荐(0)