图论
Richard_for_OI
老年退役选手orz
展开
-
差分约束系统
N个未知数,M个不等式,形如xi - xj ≤ ck。想求一组解满足所有条件。解法:从j到i连接权值为ck的有向边,求单源最短路(spfa)。负环即无解。负环判定:在更新dist时,更新cnt(1~x的最短路所包含的边数,若≥n,则有负环)。这样会比记录入队次数要快。一般差分约束都要根据题目,人为添加一些条件。...原创 2018-04-27 14:35:05 · 136 阅读 · 0 评论 -
最小生成树深入学习
简称MST。有两个方法,kruskal(稀疏图)与prim(稠密图)。现给出prim的代码:int a[N][N], d[N], n, m, ans; //a是邻接矩阵bool v[N];inline void prim() { memset(d, 0x3f, sizeof(d)); memset(v, false, sizeof(v)); d[1] = 0; for(int i = ...原创 2018-02-14 20:51:43 · 344 阅读 · 0 评论 -
单源最短路次短路计数
可以使用dp的思想,在dijkstra的同时更新计数。首先我们只考虑最短路计数。在dijkstra的同时开一个数组ans,ans[i]表示从1~i的最短路数量。毫无疑问我们可以用有后效性dp的思想去更新(迭代)。每次跑dijkstra,取出点x,访问他的出边,指向的点我们记为y,先判断能不能更新,如果能更新,那么ans[y] = ans[x](目前只有可能是从这个x点走到y,才满足最短路)。否则,...原创 2018-02-14 12:31:19 · 644 阅读 · 0 评论 -
有向图最小环问题
有向图必须满足每一条边都是有向的,即若存在边x->y,就不能存在边y->x。这样的话,联想最短路,发现有向图如果一个点两次被遍历,那一定是成一环。并且,有向图最小环定义是不存在点数限制的,无向图之所以有约束,是避免把最短的一条边走两次。所以无向图只能使用floyd。这段文字是我刚才咨询了lyd之后,总结出来的。具体做法是,枚举每一个点,执行dijkstra算法,不同的是,处理完起点后,...原创 2018-02-13 23:21:51 · 1761 阅读 · 0 评论 -
floyd求无向图最小环——poj1734
给定一个无向图,求出图中由 3个及以上个点构成的环的边权和 中的最小值。(一个点不能遍历多次)在floyd时,先循环k,然后是i和j,你会发现在每次进入一个新的k循环时,每一个d(i,j)都保存着从i到j,只经历了编号不超过k-1的节点的最短路、于是,min{d(i,j)+ a(j,k)+ a(k,i)} (1≤i<j<k)就是满足以下性质的最小环:由编号不超过k的节点构成且必定经过节点k。(式...原创 2018-02-13 22:45:37 · 941 阅读 · 0 评论 -
floyd传递闭包
传递闭包(我第一反应是凸包emmm),就是把具有传递性的关系传递开。一般我们用一邻接矩阵储存。比如许多的并查集解决的问题,如果需要细致探究(效率O(n³)),可以用传递闭包去做。看一道题吧,poj1094,不等式的传递性。这道题在处理方面,d(i, j)为1时表示i<j,而其他情况都用0表示。若碰到一个式子用大于号连接,那么反过来即可。这题比较繁琐,要二分,并且有俩坑。1、矛盾与不确定,优先...原创 2018-02-13 20:48:01 · 1191 阅读 · 0 评论 -
拓扑排序正式学习
给一有向无环图,若一由图中所有点构成的序列满足,对于图中每条有向边x->y,在序列中x都出现在y前,则该序列就是一个拓扑序。拓扑排序过程:1、建一空拓扑序列记为A2、把所有点的入度存在deg数组里,起初就把入度为0的点初始化入队中(队,并不是序列)3、进入宽搜循环,每次取出队头,放入拓扑序列。然后枚举从队头发出的每条边(x->y),把deg[y]减1。若减完为0,入队。...原创 2018-02-13 19:02:31 · 225 阅读 · 0 评论 -
种类并查集 poj1182
种类并查集的核心思想就是拆点。比如本题食物链,我们把一个点拆为同类(self),捕食(eat),天敌(enemy)。我代码中的变量描述的很清楚,直接上代码:#include <cstdio>#define N 50010int n, k, fa[3*N];int getfa(int x) {return (fa[x] == x)?x:(fa[x] = getfa(fa[x]));...原创 2018-02-13 18:35:33 · 280 阅读 · 0 评论 -
bzoj1006(弦图最大势)
对一个图进行染色,要求每一条边相连的两个点都是异色的。求所用到颜色的最小数量。此题保证图为一个弦图(周长>=4的环中间一定有一条弦),使用最大势算法。最大势:最初所有点的值都是0。做n次,每次找出值最大的一个点p(如果有多个就任意),把与之相连的点都+1,然后删除p(p的值要保留)。做完后,答案就是所有点的分值中出现过的不同的数字的个数。由于复杂度太大,必须要优化。考虑到最多分原创 2017-12-07 20:56:10 · 370 阅读 · 1 评论 -
bzoj1005
这道题在会prufer后会很简单,就是组合数嘛避免高精度要分解质因数。到分解质因数那一步我做的完全没问题。高精度乘法死活查不出来错了。于是随便贴了一个高精度乘法。可算是过了明天继续。#include #include #include #define N 1100#define ll long longusing namespace std;struct abcd{原创 2017-12-06 22:29:42 · 245 阅读 · 0 评论 -
树的prufer数列(prepare for bzoj1005)
对于一棵无根树,可以转为数列。tree->prufer:每次找到度为1的编号最小的点,把与之相连的点进队,然后删除这个度为1的点。不停的做,直到图中仅剩2个顶点。prufer->tree:另建一集合G包含1~n的全排列。每次找出G中最小的且不在prufer中的点,将该点与prufer序列的首项连一条边,并将这两个点都删除。重复操作n-2次,然后再把集原创 2017-12-06 20:54:10 · 289 阅读 · 0 评论 -
NOIP2017 day2 t2 treasure题解
这是我第一次发文章,挺激动的。我未来所有的文章,都会保证是原创。来看题目大意。给出n个点(n≤12,第一印象我想应该是可以使用暴力求解吧),m条边(m貌似有点大诶,远大于n²,这说明肯定有重边,开一个邻接矩阵就可以解决)组成的一个无向图。现在要生成一颗树,root节点的深度给0。树有一个总分,公式是:∑(i到他父节点的边权×i的深度)。请输出所有可能的生成树中最大的总分。数据约定与分析:原创 2017-11-30 19:54:01 · 642 阅读 · 0 评论 -
线段树优化建图
有一种最短路问题,有的边是从区间到区间的,这个时候点操作就不是很好办(边比较多)。于是考虑建线段树优化建图。两颗线段树:入与出。(出表示从这里出发,入表示进到了这个点)于是每条区间加边就可以转为log级别。1、平行节点间,从入连向出一条0边(进入了这个点,当然可以从这个点出发)。2、入线段树中,每个点都像左右儿子区间连0边(进入了这个区间,也可以认为进入了区间的子集)。3、出线段树每个点都像父亲连...原创 2018-05-10 22:07:47 · 2603 阅读 · 0 评论 -
TJOI2018 d1t2 智力竞赛
题意不太明确......这题的n需要一上来就+1。就是求一个可交最小路径覆盖,二分答案即可。不知道为什么我的常数那么大,别人几乎300ms就完事了,我需要800ms。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;inline char gc() { ...原创 2018-05-15 22:21:33 · 375 阅读 · 0 评论 -
[NOIP2017 d2t3] 逛公园
Problem给一张有向图(无重边、自环,如果有的话应该会麻烦许多吧)。求从1~n有多少种走的方案?其中每一种方案中,走的距离均不超过最短路+K。多组测试数据 + 此题数据范围 = NOIP2017卡常神题。Solution提供一种优美的做法——记忆化搜索。 建一个正图、一个反图。跑一次反向最短路(常用技巧)。 f[u][k]表示dis(u, n) ≤ MinDis(u, ...原创 2018-06-11 22:33:12 · 250 阅读 · 0 评论 -
所谓万能的树的直径
码一个万能的求树的直径的方法,在树上带负权时候用用,有点麻烦,但也算是dfs两次吧。我们试想一个问题,如果dfs两次,可能会导致如下现象:这样的话,两次dfs就错了(从1开始做,直接奔着4去)。于是我们考虑这样一个事情。如果对于树上的每个节点,我们都求出距离它最远的点以及他们间的距离,然后找出这n个距离中最大的一个,是不是就是直径呀。但是吧,说着都挺好的,但是这个距离哪那么好求啊!最早我想跑个最短...原创 2018-02-15 23:57:55 · 513 阅读 · 0 评论 -
bzoj1912
Problemn个村庄,构成一棵树,边权均为1。起点为1,要遍历所有节点,并且还要回到1。易得,花费恒等于2*(n - 1)。现在可以修k条路,使得花费最少。(k要么是1要么是2,这是突破口)Solution我们加一条(u,v),就相当于连同u->v的路径一起构成了简单环。那么我们就可以用这个1来代替一次环的返回。贪心的想,这个路径是树的直径时自然是最妙的。于是k=1就解决了。那如果k=2,...原创 2018-02-16 20:45:52 · 372 阅读 · 0 评论 -
BJOI2018 求和
虽然是一个预处理的水题,但我最近不知道怎么了,code频频出bug。居然没判下标越界到-1的情况。#include <cstdio>#include <cstring>#define N 300010typedef long long ll;const ll mo = 998244353;inline char gc() { static char now...原创 2018-04-18 21:12:20 · 287 阅读 · 0 评论 -
2-SAT练习 poj3683
ProblemSolution既然要求时间不冲突,那么我们就O(n²)的去寻找冲突的时间对。若对于A这对夫妻与B这对夫妻,A[i]时间举行仪式和B[j]时间举行仪式的时间是冲突的(恰好无缝衔接不算冲突),那么就说明如果在A[i]时间举行仪式,一定就要在B[j^1]时间举行。若在B[j]时间举行,也一定要在A[i^1](这恰好是一个命题与他的逆否命题)。于是我们就可以按2-SAT的套路去解题了。直接...原创 2018-03-18 16:31:21 · 233 阅读 · 0 评论 -
2-SAT
ProblemN个变量,每个变量只有2种可能的取值。再给M个条件,形如“若变量A[i]赋值为A(i, p),那么变量A[j]就必须赋值为A(j, q)”,其中p,q∈[0, 1]。问是否存在合法赋值,满足所有条件。Solution(1)建立2*N个节点的有向图,每个A[i]对于两个节点,不妨设为i和i + N。(2)考虑每个条件,从i + p * N发出有向边到j + q * N。(3)对于每个条...原创 2018-03-17 22:09:15 · 479 阅读 · 0 评论 -
HAOI2017 新型城市化
Problem现有由n个城市构成的一个无向图。保证,取出最大团后,剩下的也是一个团。然后问,再加哪条边,可以使最大团数目改变?Solution其实这个题的输入已经十分的给面子了。给的是补图。补图的最大独立集,就是原图的最大团了。而补图是个二分图,n-最大匹配数就是最大独立集。我们如果使最大匹配数减少,那么最大独立集数就会增加,原图最大团也会增加。既然如此,我们就找出补图中的最大匹配必须边。即为答案...原创 2018-03-13 18:52:16 · 388 阅读 · 0 评论 -
最大独立集
独立集:给一无向图,找出一个点集,使得任意两点之间都没有连边,这个点集就是独立集。而点最多的独立集,就是最大独立集。对应地,任意两点之间都有边,我们称之为团。同时也有最大团。定理:无向图的最大团等于其补图的最大独立集。若我们求解一个一般无向图的最大团、最大独立集,这都是NPC问题。(NP完全问题,此类问题目前只能暴力搜索,无多项式时间的解法)但是二分图就不一样了。对于一个有n个节点的二分图,最大独...原创 2018-03-11 21:27:44 · 6772 阅读 · 0 评论 -
二分图的覆盖
最小点覆盖,即用最少的点去覆盖所有的边。(只要一条边的一个节点被标记,那这一条边就被覆盖啦!)解法:二分图最小点覆盖包含的点数等于二分图最大匹配的边数。惊不惊喜意不意外!!!!思考一下会不会存在一种情况,使得一条边的两个点都被选择?当然有可能!主要还是难在构图的。来看俩题意思一下。poj1325:有两台computer及N个任务,每台computer有M种模式。对于每个任务给定a[i],b[i],...原创 2018-03-11 21:15:28 · 560 阅读 · 0 评论 -
多重匹配
广义的二分匹配。每个boyi最多可以同时和kl[i]个girl在一起,每个girli最多可以和kr[i]个boy在一起。(这样比喻多好理解)解决方案:1、拆点。2、如果有一边所有的人都比较保守,只能和一个人在一起,那么我们考虑:如果把这些点都弄到右边,可以在dfs时直接给每个左边的点做kl[i]次;如果都弄到左边,那让右边的节点可以匹配kr[j]次,若超过次数,就尝试递归当前已和她匹配上的这些节点...原创 2018-03-11 19:10:16 · 617 阅读 · 0 评论 -
骨牌覆盖问题
ycjh期间,本蒟蒻用状压dp成功解决了工坊二题目。(其实就是状压裸题,并且还简化了)王程教授说了句话:“如果扩展到180呢?怎么办?”当时我就想到了二分图匹配。但是我那时并不会啊。而且我构图也差,也没细想二分+最大流。经典题目:给定一N行M列的棋盘,某些格子禁止放置。有长2宽1的多米诺骨牌,并且禁止骨牌重叠,问最多能放多少块?构造二分图匹配模型有两个要素:(1)节点能分为独立的两个集合,每个集合...原创 2018-03-11 18:53:54 · 1067 阅读 · 0 评论 -
二分图匹配(不带权)
首先,一张无向图是二分图,充要条件为,不存在奇环(边的数量为奇数)。于是可以黑白染色去判定。若有冲突的,就不是二分图。再来看二分图最大匹配。不带权的那种。我们定义一个名词:增广路。若对于一组匹配,存在一条从非匹配点到另一个非匹配点的路径path,使得非匹配边与匹配边在path里交替出现,那么path就是这个匹配的增广路。显然增广路的长度是奇数,且第奇数条都是非匹配边,偶数条都是匹配边。所以我们可以...原创 2018-03-09 22:58:42 · 226 阅读 · 0 评论 -
bzoj1123(权限题)
割点的题目,一定要考虑全面。注意有序点对,必须×2。因为删掉割点的所有边后,可能形成的连通块有:1、孤单的节点i自己 2、i的儿子的子树们 3、除了这些点,剩下的所有点构成一个//权限题 #include <cstdio>#define N 100010#define M 500010#include <algorithm>using namespace std...原创 2018-03-07 21:31:14 · 469 阅读 · 0 评论 -
Tarjan算法(一)——无向图中的割边、割点判定
Tarjan这个人啊,你们可能不太了解,但是,他创造的算法你们一定就听过了——Splay、lct……我们今天来看以他名字命名的图论算法。介绍三个东西。dfn:时间戳没什么好说的。搜索树:dfs这些点的时候,遍历的边必定是构成一棵树的(一个点只经过一次)。low:追溯值。一个节点i的追溯值要么是自己的dfn,要么就是另外一个点的dfn(这个点满足:只通过一条不在搜索树上的边,可以到达...原创 2018-03-07 21:14:15 · 1801 阅读 · 0 评论 -
关于最小生成树、次小生成树那些不吐不快的事情
最小生成树一定满足这么一个性质,如果我们找一条x到y的路径,与备选边(没有被加进去)中x到y的边构成一个环的话,那么环中最大值肯定是备选边。不然这就不是最小生成树了。所以次小生成树时,我们每次最多最多就改一条边,改两条边的话答案就铁定大了(你别告诉我你改完一次之后还是最小生成树,然后你改第二次!!!改变是严格的那种)。然后我们每次对于备选边,判断x->y路径中,最大值是否等于备选边边权,等于...原创 2018-02-17 22:40:59 · 218 阅读 · 0 评论 -
ContestHunter#56-C 异象石
Problem一棵树(1e5节点),初始时均没有异象石。有m个时刻,每个时刻可能会发生三件事:①某个点出现异象石 ②某个点异象石消失 ③最短用多大长度的路径,把异象石串在一起。Solution给每个点打时间戳dfn,然后把有异象石的节点的dfn,排成一个序列,平衡树维护,以dfn为排序关键字,主要存节点编号(注意收尾要考虑为相连的),则每相邻两个点的距离加在一起,就是答案的二倍。于是我们开全局变量...原创 2018-02-17 22:33:22 · 688 阅读 · 0 评论 -
树的直径题目——树网的核(出自NOIP2007)
给定一棵树,可能有很多直径,要求在直径上找出两个节点,它们构成了一条路径,其距离≤S(给定),并且使得偏心距最小,求这个最小偏心距的值。偏心距的定义:距离这条路径最远的点。(点与路径的距离为:路径上,距离路径外的那个节点最近的点的距离)首先可以分析得到,在一端确定的基础上,这个路径越长越好。然后,题目说可能有很多直径,我们发现无论选取哪一条直径,都是不影响结果的。因为直径如果有多条,它们公共部分的...原创 2018-02-17 20:11:33 · 361 阅读 · 0 评论 -
树上分块 bzoj1086
对树dfs,每次dfs完儿子,如果不小于块大小的下限,那么就独立成块。用栈维护。#include <cstdio>#define N 1010struct edge {int to, next;}e[N<<1];int n, B, head[N], cnt = 1, vis[N];inline void ins(int x, int y) {e[++cnt].to ...原创 2018-05-24 21:12:51 · 304 阅读 · 0 评论