
-------------图论---------------
文章平均质量分 59
Lynstery
一只蒟蒻
展开
-
[最小割] BZOJ3144: [Hnoi2013]切糕
经典的最小割建图,用 ∞∞\infty 边体现限制条件。inline char gc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline int getint(){ ...原创 2018-02-21 22:26:54 · 517 阅读 · 0 评论 -
[二分图最大独立集] BZOJ4808:马
棋盘01染色,然后把互相能打到的点连边,发现是个二分图。 二分图最大独立集 == 点数 −- 最大匹配数 Dinic练手…#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=40005,maxe=400005,flag[8][2]={{原创 2017-11-10 11:53:34 · 388 阅读 · 0 评论 -
Dinic——模板整理
Dinic:最大流算法 时间复杂度:O(n)#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int maxn=10005,maxe=200005;struct Edge { int from,to,cap,flow; } Es[maxe];int原创 2017-02-21 19:13:37 · 451 阅读 · 0 评论 -
[杂题 异或 带权并查集] BZOJ2303: [Apio2011]方格染色
不太容易想到。首先要把限制看成异或,即每个点都要满足 ai,j xor ai,j−1 xor ai−1,j xor ai−1,j−1=1a_{i,j}\text{ xor }a_{i,j-1}\text{ xor }a_{i-1,j}\text{ xor }a_{i-1,j-1}=1 这些限制太复杂了,怎么进行转化呢? 注意到,如果我们已经确定的第一行和第一列的所有元素,则其他也确定了。所以原创 2017-10-31 14:16:39 · 436 阅读 · 0 评论 -
[二分+并查集] BZOJ1821 : [JSOI2010]Group 部落划分 Group
二分距离最小值。两个点的距离小于这个值,就一定要在同一个部落中。并查集判断一下就行了。#include<cstdio>#include<algorithm>#define sqr(x) ((x)*(x))using namespace std;typedef long long LL;const int maxn=1005;int n,m,a[maxn],b[maxn],fa[maxn]原创 2017-11-01 15:45:40 · 329 阅读 · 0 评论 -
[杂题 计数 图论] Codeforces 51E. Pentagon
挺烦的题…..很容易wa… 总之就是求出 Bi,jB_{i,j} 表示 ii 到 jj ,走两步的方案,Ci,jC_{i,j} 表示走三步。 然后 ∑Bi,j∗Ci,j\sum B_{i,j}*C_{i,j}。然后会有不合法的和重复的… 不合法的大概是 一个三角形多出一个脚…或者就是一个三角形… 在纸上大力分类讨论一下,把它们都扣去就好了。 参考了网上dalao的实现。#include<cs原创 2017-11-08 20:12:50 · 468 阅读 · 0 评论 -
[DP] ZROI 2017提高1 T2.给 Ca
DP状态的设计比较巧妙,考虑树按dfs序的顺序生成的过程,设 f[i][j]f[i][j] 表示放了 ii 个节点,根到当前节点向左走 jj 次,的方案数。 转移就是,再往左放一个,或者回到最近的向左走的节点的父亲,在右儿子位置放。 f[i+1][j+1]←f[i][j], f[i+1][j−1]←f[i][j]f[i+1][j+1] \leftarrow f[i][j],\ \ f[i+1]原创 2017-10-06 16:46:22 · 402 阅读 · 0 评论 -
[二分图匹配] HHHOJ#51. Book
我太菜了……#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10005,maxe=20005;int n,m,fir[maxn],nxt[maxe],son[maxe],tot;void add(int x,int y){ son[++tot]=y; nx原创 2017-10-20 08:49:43 · 747 阅读 · 0 评论 -
[Hall定理 + 线段树] LibreOJ#6062. 「2017 山东一轮集训 Day2」Pair
可以先对 BB 排序,然后 AA 中的每个数能匹配的 BB 中的元素都是一个后缀的形式。 对于一个 AA 元素的集合是否与 BB 有完美匹配呢? 可以考虑Hall定理,随便选一个B中的集合S: 由于图的特殊性,N(S)=N(S中从下标最小的元素开始的后缀)N(S)=N(S中从下标最小的元素开始的后缀) ,也就是说只要所有后缀都满足 N(S)≥|S|N(S)\ge |S|,则任意集合都满足。 这原创 2017-10-10 21:46:51 · 1047 阅读 · 0 评论 -
[最短路] 2017 计蒜之道 复赛 D. 百度地图导航
水题。就是建图需要优化一下,容易想到对与每个城市群建点,然后就把城市和对于群之间连边。为了避免属于同一个群的城市通过城市群的点走,可以把城市群的点拆成两个,对应出和入,就能分离开了。#include<cstdio>#include<cstring>#include<queue>#include<algorithm>using namespace std;typedef long long原创 2017-10-03 22:09:21 · 345 阅读 · 0 评论 -
[容斥+Purfer编码] 51Nod1806 wangyurzee的树
很久以前看过 PurferPurfer 但忘完了…补一补… mm 只有 1717,所以想到暴力容斥。而确定一些节点的度的生成树个数可以直接用 PurferPurfer 解决。 具体来说,若有 cntcnt 个点的度数有约束,分别为v1,v2....vcntv_1,v_2....v_{cnt}。总方案为: (n−2−∑(vi−1))n−cnt∗∏i=1cnt(∑cntk=1(vk−1)vi−1)原创 2017-10-19 09:19:21 · 324 阅读 · 0 评论 -
[二分+最大流] BZOJ1532: [POI2005]Kos-Dicing
数据范围略有毒…一开始还以为是什么贪心… 其实就直接二分,然后最大流暴力验证一下就好了。#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=30005,maxe=100005;struct Edge{ int from,to,c原创 2017-09-29 14:23:43 · 396 阅读 · 0 评论 -
[链表] BZOJ1098: [POI2007]办公楼biu
太菜了…这都不会… 就是求反图的联通块。就是每次挑一个边在反图bfs出一个块。 我们每次找反图边扩展,是找原图中和当前节点不直接相连的其他点。直接暴力会变成 n2n^2 所以需要把访问过的点马上删去。可以用链表。 这样每个点就只访问一次了。复杂度 O(n+m)O(n+m)#include<cstdio>#include<queue>#include<cstring>#include<a原创 2017-09-29 11:00:07 · 377 阅读 · 0 评论 -
[并查集] UOJ#142. 【UER #5】万圣节的南瓜灯
任意两点之间有且只有一条简单路径 ⇔\Leftrightarrow 树 所以就是要使剩下的点构成一颗树,容易发现,随着格子数变多,边数增长的比点数快,且 KK 不会很大。所以当 n∗mn*m 太大时,不可能构成树了。粗略估计一下,5∗1055*10^5 就无解。#include<cstdio>#include<cstring>#include<algorithm>using namespac原创 2017-10-16 13:05:44 · 361 阅读 · 0 评论 -
[栈 二分图染色] NOIP2008 双栈排序
一道远古时期的联赛题,比较经典。 由于联赛快到了,这里就写一写有理有据的思考过程: 首先,这种题目应该手玩几次。我们想让字典序最小,肯定尽量往 S1S1 放。而什么时候需要用第二个栈呢?所以我们考虑当只有一个栈时,什么情况下不能排序。自己试一试之后,发现只有这种情况: 存在 i<j<k, ak<ai<aj,i<j<k,\ a_k<a_i<a_j, 。这种情况下,因为后面有 kk 要先出来,导致原创 2017-10-16 15:24:50 · 340 阅读 · 0 评论 -
[最小割+Tarjan] BZOJ1797: [Ahoi2009]Mincut 最小割
关于最小割唯一性:在残余网络上跑 TarjanTarjanTarjan 。记 idxidxid_x为点 xxx 所在 SCCSCCSCC 的编号。将每个 SCCSCCSCC 缩成一个点,得到的新图就只含有满流边了。那么新图的任一 S−TS−TS-T 割都对应原图的某个最小割。对于任意一条满流边 (u,v)(u,v)(u,v),若能够出现在某个最小割集中,当且仅当 idu≠idvidu≠...原创 2018-02-21 21:47:30 · 566 阅读 · 0 评论 -
《最小割模型在信息学竞赛中的应用》——学习笔记
《最小割模型在信息学竞赛中的应用》学习笔记基础流网络的定义,容量限制,反对称性,流守恒性…我们约定对于点集X,YX,YX,Y ,令 f(X,Y)=∑u∈X∑v∈Yf(u,v)f(X,Y)=∑u∈X∑v∈Yf(u,v)f(X,Y)=\sum_{u \in X}\sum_{v \in Y} f(u,v) ∀X,f(X,X)=0∀X,Y,f(X,Y)=−f(Y,X)∀X,Y,Z,&nb...原创 2018-02-16 00:44:50 · 981 阅读 · 0 评论 -
[最小割] BZOJ2400: Optimal Marks
论文题。 二进制每位独立算,每个编号就只有 010101 两种。可以看作分成两个集合,用最小割模型解。 题目要求在边权和最小的前提下,还要保证编号和最小。这个只需要每次从 TTT 出发倒着走,能到的点一定是在 TTT 集合内,其他的都看作是 000,这样就是最小的。#include<cstdio>#include<cctype>#include<cst...原创 2018-02-14 23:39:21 · 405 阅读 · 0 评论 -
[DFS树 + 线性基] BZOJ2115: [Wc2011] Xor
线性基裸题。需要知道一个东西:对于随意一条 11 到 nn 的路径的异或和,都可以通过任意一条 11 到 nn 路径的异或和与图中的一些环的异或和来组合得到。 然后就 DFSDFS 树找简单环,瞎搞搞…#include<cstdio>#include<algorithm>using namespace std;const int maxn=50005,maxe=200005;typedef原创 2017-12-24 19:30:12 · 387 阅读 · 0 评论 -
[树上依赖背包] BZOJ4910 LOJ2268: [SDOI2017] 苹果树
首先考虑 t−hmax≤kt-h_{max} \le k 的限制。可以看做除去最长到根链上的点各一个,剩下的最多取 kk 。 可以想到枚举叶子,求必选这个叶到根路径上各一个之后,其他取 kk 个的最大值。 普通的树上依赖背包一般是: 按后序遍历顺序 DPDP , fi,jf_{i,j} 表示后序遍历前 ii 个中选了 jj 个的最优解,后序遍历的好处是 ii 的子树内的点是 ii 前面的连续一原创 2017-12-14 19:52:17 · 754 阅读 · 0 评论 -
[虚树 + DP] BZOJ2286: [Sdoi2011]消耗战
虚树入门题。 所谓虚树就是只保留需要的关键节点及互相的lca进行重建树,在虚树上跑DP之类的,是的复杂度之和关键点个数相关。 建虚树代码:void buildVT(){ inT.clear(); sort(S.begin(),S.end(),_cmp); stk[top=1]=1; inT.push_back(1); for(int i=0;i<S.size();i++)原创 2017-11-26 20:11:09 · 372 阅读 · 0 评论 -
[WQS二分] BZOJ2654:tree
以前做这题的时候以为只是个神奇的二分,没有完全懂原理,现在发现实际上就是 WQSWQS 二分。 考虑 g(x)g(x) 表示选共 xx 条白边的最优解,可以感觉到这个 g(x)g(x) 应是上凸的,满足斜率不降。所以就 WQSWQS 二分就好了。#include<cstdio>#include<algorithm>using namespace std;const int maxn=1000原创 2017-12-19 18:25:29 · 616 阅读 · 0 评论 -
[Johnson + 桶维护DIJ ] Codeforces #843D. Dynamic Shortest Path
这题用到了 JohnsonJohnson 算法的思想,就是先一趟最短路刷出 dis(i)dis(i) 然后把图改造。边 (x,y)(x,y) 的权改为 w(x,y)+dis(x)−dis(y)w(x,y)+dis(x)-dis(y)。 这样搞之后,边权都非负,再新图上做最短路的事情与原图是完全等价的,新图上从 11 到 vv 的某条路径的长度就是原图的对应长度与 dis(v)dis(v) 的差值。原创 2017-12-10 20:33:35 · 700 阅读 · 0 评论 -
[杂题 图论 构造] Codeforces #639B. Bear and Forgotten Tree 3
瞎搞题。 从 11 往下构造出两条长度分别为 d, h−dd,\ h-d 的链,然后剩下的点全部堆到某个点下面,注意当 d=hd=h 时特殊考虑一下。#include<cstdio>#include<algorithm>using namespace std;int n,H,D;int main(){ //freopen("cf639B.in","r",stdin); //原创 2017-11-06 16:01:38 · 366 阅读 · 0 评论 -
[杂题 图论] Codeforces #437C.The Child and Toy
简单题。考虑一条边 (x,y)(x,y) 对答案的贡献,可能是 axa_x 或 aya_y ,取决于哪个点先被删。 那显然我们从大到小删就可以做到每条边的贡献是 min{ax,ay}min\{a_x,a_y\},是最优的。#include<cstdio>#include<algorithm>using namespace std;const int maxn=1005;typedef lo原创 2017-11-06 14:49:57 · 411 阅读 · 0 评论 -
[DP 倍增Floyd] LOJ#539.「LibreOJ NOIP Round #1」旅游路线
不算很难想。首先看到总钱数比较少,考虑 DPDP 出 fi,jf_{i,j} 表示从 ii 出发,已经在 ii 加了油,带了 jj 块钱,能走多远。 考虑如何转移,注意到油量比较大,所有不可能把它记到状态里。那我们就枚举下一次在哪里加油: fi,j=maxk{fk,j−pj+gi,k}f_{i,j}=\max_{k}\{ f_{k,j-p_j}+g_{i,k} \} 其中 gi,kg_{i原创 2017-11-05 16:00:07 · 582 阅读 · 0 评论 -
[dfs树]「CEOI 2017」One-Way Streets
不难的题。首先任意环上的边一定不是必经边,答案为B。我们随便搞一颗原图的dfs树,那么非树边,和每条飞树边覆盖的树上的链都是B。在树上打链覆盖的标记即可。 然后是对于每个x到y有路的限制,我们直接在x->lca打向上走的标记,lca->y打向下走的标记,最后判断一下就好了。#include<cstdio>#include<algorithm>using namespace std;const原创 2017-09-29 08:26:09 · 486 阅读 · 0 评论 -
[欧拉回路] 「Balkan OI 2016」Acrobat
我们要使左边的点度数都变为偶数。考虑第一种操作,会使两个点的度奇偶性变化,所以问题就转化成:给出一个图,选较少的边使得每个点的度满足奇偶性的限制。 这个怎么搞呢?有一个结论:若有解,则图的任意一个生成树,只取树边都能得到一组解。 怎么证明呢? 显然如果已知一组边是合法的解,那么这些边一定能在同一棵生成树上。 把这组解的边标为白色边。对于其他的任意一颗生成树,若白边在树上就取他,若白边不在树上原创 2017-09-28 08:54:37 · 352 阅读 · 0 评论 -
BZOJ1016: [JSOI2008]最小生成树计数
题意现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)数据保证不会出现自回边和重边,具有相同权值的边不会超过10条。 1<=n<=100; 1<=m<=1000; 题解做这道题需要先推出一些结论。 如果把权值相同的边看做一个边组。则所有最小生成树中,每个边组所用的边都是固原创 2017-04-19 20:40:43 · 622 阅读 · 1 评论 -
[二分 + 2-SAT] HDU3622: Bomb Game
题意给定平面上n对点,每对点必须且只能先一个。以选出的n个点做圆,这些圆不能有公共部分。求n个圆的半径的最小值的最大值。题解我的第一道2-SAT。 容易想到二分答案,每对点的选择可以看做是一个布尔变量,真表示取第一个,假表示取第二个。根据当前二分的半径可以判断出某两个点能否同时取到。这就得到了一堆限制。然后2-SAT进行验证即可。#include<cstdio>#include<cmath>#原创 2017-04-08 19:35:16 · 406 阅读 · 0 评论 -
[最大流] BZOJ1066: [SCOI2007]蜥蜴
题意在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同原创 2017-03-15 09:05:50 · 511 阅读 · 0 评论 -
[费用流] BZOJ1070: [SCOI2007]修车
题意同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。 顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。 第一行有两个m,n,表示技术人员数与顾客数。 接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人员维修第i辆车需要用的时原创 2017-03-09 19:32:41 · 532 阅读 · 0 评论 -
[平衡树+启发式合并 || 点分治] POJ1741 Tree
题意这题就是楼教主男人必做八题之一 给出一棵有边权的树,以及一个数K,求距离小于等于K的点对的个数。题解点分治显然可做,对于当前点分树,把所有点到当前根的距离排序后扫一下即可。 复杂度O(nlog22n)O(nlog^2_2n)。 这里主要讲一下另一种不错的思路——平衡树+启发式合并。 具体做法: 随便找个根,然后递归下去从叶到根把子树不断合并。过程中,给每个子树建平衡树来存其中所有点到子树原创 2017-02-27 20:41:51 · 810 阅读 · 1 评论 -
动态树分治——模板整理
好像也不算什么模板。。。#include<cstdio>#include<queue>#include<algorithm>using namespace std;const int maxn=100005, maxe=200005;int n,m,w[maxn],last_print;int fir[maxn],nxt[maxe],son[maxe],tot;bool vis[max原创 2017-02-21 19:59:28 · 551 阅读 · 0 评论 -
最小费用最大流(spfa增广)——模板整理
这个算法好像没名字。。就是每次spfa增广。 时间复杂度O(n*m^2*3)?#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int maxn=5005,maxe=100005;int n,m,nxt[maxe],S,T,fir[maxn],tot=原创 2017-02-21 19:35:52 · 1132 阅读 · 0 评论 -
[Prufer数列] BZOJ1005: [HNOI2008]明明的烦恼
题意给出n个节点的度数di,允许在任意两点间连线,可产生多少棵度数满足要求的树?若对度数不要求,则di=-1。 n<=1005;题解这道题需要知道Prufer数列的知识。 prufer数列是无根树的一种数列,数列与树两两对应。也就是说一种树只有唯一的一种数列来表示它。反过来给你一个数列,你总能把他转化成对应的唯一的树。 下面看数列和树是如何相互转换的: 树–>数列:每次选编号最小的叶节点(度原创 2017-02-19 23:19:59 · 487 阅读 · 0 评论 -
[最小割+对偶建图+最短路] BZOJ1001: [BeiJing2006]狼抓兔子
题意题解题意其实就是求最小割。但是发现点数和边数都特别大,直接上最大流肯定T了。那么如何转换呢? 对于可以画在一个平面且没有边相交的图,我们称之为平面图。平面图中的边把平面分割为一个一个面,本题的面即是一个个三角形。最外围的无穷大的面称为外部面。 所谓对偶建图即是把面当做节点,对于每条公共边界,对应的两个面之间连边。 对于最小割问题,我们就可以把S-T的一个割看成一条路径,其经过的边即是割掉的原创 2017-02-17 22:06:32 · 599 阅读 · 0 评论 -
[最小费用最大流] BZOJ2324: [ZJOI2011]营救皮卡丘
题意题解题目的意思即求K条路覆盖所有节点,走过的总路程的最小值,有一个限制条件就是当某个人从i走到j时,途径的节点都<=j。 对于这个限制条件,我们可以简单的floyd预处理出来,得f[i][j] 为i到j的最短路,且途中的点都<=max(i,j)。 我们需要简化模型:某个人走过的一条路径肯定是分阶段的,也就是说他从某节点i经过一系列合法点到j后,需要停一停等其他人开拓了一些节点再走。我们把某一原创 2017-02-16 09:00:22 · 540 阅读 · 0 评论 -
[二分图最大匹配] BZOJ1433: [ZJOI2009]假期的宿舍
题意题解大水题,二分图匹配。对与每个人向他能睡的床建边即可。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=105, maxe=505;int n,m,_test,res[maxn];int fir[maxn],nxt[maxe],son[maxe],tot;b原创 2017-02-15 20:22:31 · 425 阅读 · 0 评论 -
[动态点分治] BZOJ3730: 震波
题意给定N个点的一棵边权都为1的树,每个点有点权 。M次操作,两种类型 1.单点点权修改。 2.给出x和k,询问到x的距离不超过K的所有点权和。 操作加密,强制在线。 N,M<=100000题解动态点分治。 同样把信息收集到根。对于每个点分树,把所有点放到一个树状数组中,数状数组的下标即是到根的距离。要注意相同子树中的东西计算重复了,为了抠去重复部分,还需要对每个点分树再开一个数状数组,维原创 2017-02-15 14:35:50 · 725 阅读 · 0 评论