图论
JeremyGJY
然而并没有什么好说的
展开
-
【图论】【二分图匹配】[BZOJ 1085]完美的牛栏
二分图匹配裸体,模板题。#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>using namespace std;const int MAXN = 500;const int MAXM = 50000;struct node{ int v; node *next;}Edg原创 2015-07-27 14:39:31 · 1315 阅读 · 0 评论 -
【网络流】【费用流】[SCOI2007]修车
同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。输入:2 23 21 4输出:1.50数据范围: (2<=M<=9,1<=N<=60),原创 2016-01-08 13:08:31 · 576 阅读 · 0 评论 -
【半平面交】【计算几何】[BZOJ1038][ZJOI2008]瞭望塔
题目描述致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安。我们将H村抽象为一维的轮廓。如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), (x2, y2), …. (xn, yn)来描述H村的形状,这里x1 < x2 < …< xn。瞭望塔可以建造在[x1, xn]间的任意位置, 但必须满足从瞭望塔的顶端可以看到H村的任意位置。可见在不同的位原创 2016-02-05 16:18:02 · 637 阅读 · 0 评论 -
【匈牙利算法】【二分图匹配】【转载】趣写算法系列之--匈牙利算法
【书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程】匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。 ——-等等,看得头大?那么请看下面的版本:通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一转载 2015-11-27 14:08:15 · 497 阅读 · 0 评论 -
【高斯消元】【图论】[BZOJ2115]Xor高斯消元
题目描述题目解析首先如果直接思考那么我们不容易得到答案,那么我们换一种思路,我们先解决这个问题的弱化版本,我们考虑在无向图GG中知道SS和TT如何去寻找最大的环路首先我们根据其中一个点(这里选择SS)为根构造一棵树 那么我哦们可以容易的发现我们需要的就是包含SS-TT(根到TT)的路径的异或值。但是当前并不是最优解,那么我们可以发现如果这个时候我们可以找到一个到达TT的更优解那么这条路径必定与当前原创 2016-01-31 16:41:52 · 632 阅读 · 0 评论 -
【几何】[HNOI2008][BZOJ1007]水平可见直线
题目描述在xoy直角坐标平面上有n条直线L1,L2,…Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线: L1:y=x; L2:y=-x; L3:y=0 则L1和L2是可见的,L3是被覆盖的. 给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有原创 2016-02-02 14:56:35 · 589 阅读 · 0 评论 -
【树】【数论】[BZOJ1005][HNOI2008]明明的烦恼
题目描述自从明明学了树的结构,就对奇怪的树产生了兴趣…… 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树?样例输入3 1 -1 -1样例输出2题目解析首先我们根据prufer数列可以知道任意一棵无根树可以表示为任意一个长度为n−2n-2的串并且有以下的性质任意一点的度为did_i那么该数字将会在数列中出现di−1d_i-1次,那么我们可以知道该数原创 2016-02-02 18:05:59 · 2229 阅读 · 3 评论 -
【线段树】【树】【网络流】[UOJ#77]A+B Problem
题目描述 感谢geng给我了正确的数据范围题目解析首先我们可以发现如果我们不考虑有奇怪的格子,那么显然我们有ans=∑黑色的格子bi+∑白色的格子wians=\sum_{黑色的格子}b_i+\sum_{白色的格子}w_i那么ans=∑i=1nwi+bi−∑i=1nmin{wi,bi}ans=\sum_{i=1}^nw_i+b_i-\sum_{i=1}^n\min\{w_i, b_i\}那么我们原创 2016-03-19 12:13:53 · 1500 阅读 · 1 评论 -
【图论】单源点最短路模板(有向图)Dijkstra
#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <algorithm>#include <vector>using namespace std;const int MAXN = 500;const int MAXM = 20000;typedef pair<int, int原创 2016-03-09 13:49:20 · 1210 阅读 · 1 评论 -
【树】【平衡树】Splay自顶向下模板
操作1插入x 操作2删除x 操作3查询x排名 操作4查询排名为x的数 操作5查询x的前驱 操作6查询x的后继#include <cstdio>#include <cstring>#include <iostream>using namespace std;struct node{ int sz, val; node *ch[2]; node(){ch[0]原创 2016-03-10 13:49:26 · 693 阅读 · 1 评论 -
【最小生成树】【并查集】[USACO2016 金组]Fenced In
题目描述Farmer John has realized that many of his cows are strangely agoraphobic (being fearful of large open spaces). To try and make them less afraid of grazing, he partitions his large field into a numb原创 2016-03-12 16:12:48 · 1064 阅读 · 1 评论 -
【线段树】[BZOJ3787][AHOI2014]奇怪的计算器
题目描述Description【故事背景】JYY有个奇怪的计算器,有一天这个计算器坏了,JYY希望你能帮助他写 一个程序来模拟这个计算器的运算。 【问题描述】 JYY的计算器可以执行N条预设好的指令。每次JYY向计算器输入一个正 整数X,计算器就会以X作为初始值,接着依次执行预设的N条指令,最后把 最终得出的结果返回给JYY。 每一条指令可以是以下四种指令之一:(这里a表示一个正整数。)原创 2016-04-07 17:53:57 · 760 阅读 · 0 评论 -
【后缀自动机】【SAM】【自动机】【数据结构】后缀自动机理解(入门)
引入来吧后缀自动机 我们先来看一看后缀数组可以干一些什么事情 1.可以查看当前后缀在所有后缀的排名 2.可以看子串的最大和 但是缺点呢却也非常的明显——显然这tm是个静态的。。。。 于是只好另辟蹊径——后缀自动机 我们来看看后缀自动机可以干一些什么: 1.可以查看当前后缀在所有后缀的排名 2.可以看子串的最大和 3.动态插入新的节点 4.空间开销小 ……. 擦既然这么多优点为什原创 2016-04-08 07:48:31 · 3686 阅读 · 2 评论 -
【AC自动机】【数据结构】【树】【Aho-Corasick automation】AC自动机理解(入门)
引入我们首先提出一个问题: 给出n个串每个串的长度≤m\leq m 然后给出一个长度为k的串,询问前n个串中有多少个是匹配成了的暴力搜索这题不是sb题目吗? 随随便便O(kmn)跑过。 。。。。 n=10000 m=50 k=1000000 。。。。 好吧——我们用AC自动机吧样例首先我们举一个例子,我们有n=3个串he 和 her 和 she 然后我们通过构建Trie可以得到下图原创 2016-04-08 12:15:47 · 1467 阅读 · 0 评论 -
【Trie】【树】[CQOI 2016]路由器(Route)
题目大意由于还没有拿到题目大概先说一下题意吧:首先给你一个空空的路由器,大家然后我们对于一个空的路由表有两种操作插入一个新的IP寻址方式查询一个IP在[L,R]中最终寻找到的IP被修改了多少次这里IP的寻找方式是这样给出的我们有A.B.C.D四位数字外加一个L,首先我们将A.B.C.D转换为二进制,然后从A开始比较L为如果和询问的IP转换成二进制如果前面L位可以匹配我们认为这个是成功匹配的但是如原创 2016-04-10 16:22:54 · 1237 阅读 · 1 评论 -
【动态规划】【图论】[NOIP模拟赛]独立集
题目描述: 有一天,一个名叫顺旺基的程序员从石头里诞生了。又有一天,他学会了冒泡排序和独 立集。在一个图里,独立集就是一个点集,满足任意两个点之间没有边。于是他就想把这两 个东西结合在一起。众所周知,独立集是需要一个图的。那么顺旺基同学创造了一个算法, 从冒泡排序中产生一个无向图。这个算法不标准的伪代码如下:void bubblesortgraph(n,a[])//输入:点数n,1到n的全排列a/原创 2015-10-22 13:18:23 · 1526 阅读 · 0 评论 -
【动态规划】[NOIP 模拟赛]密码
题目描述:假发通过了不懈的努力,得到了将军家门锁的密码(一串小写英文字母)。但是假发被 十四和猩猩他们盯上了,所以假发需要把密码传递出去。因为假发不想十四他们发现几松门 前贴的小纸条就是将军家的密码,所以他加密了密码(新八:听起来有点诡异)。加密方法 如下:随机地,在密码中任意位置插入随机长度的小写字符串。 不过,假发相信银桑和他那么多年小学同学,一定能猜中密码是什么的(新八:银桑什 么时候成攮夷志原创 2015-10-22 13:13:39 · 1391 阅读 · 0 评论 -
【动态规划】【图论最长路】[NOIP模拟赛]益智游戏
题目描述 小P 和小R 在玩一款益智游戏。游戏在一个正权有向图上进行。 小P 控制的角色要从A 点走最短路到B 点,小R 控制的角色要从C 点走最短路到D 点。 一个玩家每回合可以有两种选择,移动到一个相邻节点或者休息一回合。 假如在某一时刻,小P 和小R 在相同的节点上,那么可以得到一次特殊奖励,但是在每 个节点上最多只能得到一次。 求最多能获得多少次特殊奖励输入 5 5 1 2 1 2原创 2015-10-22 13:24:31 · 1350 阅读 · 0 评论 -
【图论】【二分图匹配】[ZOJ 1002]Fire Net
这道题目就是对不同的方向的同一行或者列的连通块进行标号,然后对方向不同且相交的连通快连边,最后做一次二分图最大匹配就好了。#include <cstdio>#include <cstring>#include <algorithm>//#include <conio.h>using namespace std;const int MAXN = 4;bool vis[MAXN*MAXN*M原创 2015-07-27 17:02:24 · 934 阅读 · 0 评论 -
【图论】【启发式搜索】【二分查找】[POJ 3897]Maze Stretching
启发式搜索主要就是加速,其实不用也可以过。二分L然后每次看最短路是多少,估价函数就是曼哈顿距离,然后注意精度误差就好了Tip:在POJ上交这道题目记得用c++千万不要用g++#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <queue>using namespace std原创 2015-07-27 14:44:03 · 664 阅读 · 0 评论 -
【图论】【二分图匹配】[ZOJ 1654]Place the Robots
首先因为草坪并不影响互相攻击,所以应该把整个图每一行按照墙分成不同的连通块并且编号,同理编号竖向的连通块,但是因为机器人不能放在草坪上所以只有当两个连通块的交点的地方为空地的时候机器人才能够站立,那么按照http://blog.csdn.net/jeremygjy/article/details/47087593改一下数据范围改一下建边的时候检查一下是否为空地就好了。#include <cstdio原创 2015-07-27 17:36:17 · 425 阅读 · 0 评论 -
【图论】【二分图匹配】[POJ 3692]Kindergarten
首先我们要求的是一个完全图,那么因为男生之间互相认识,女生之间互相认识,那么我们只考虑男生和女生认识的情况,我们要选择一个大家都互相认识的出来,那么做当前图的补图可以发现如果两个点之间有直接关系,那么这两个点一定是互相不认识的,如果没有,那么一定是认识的,所以选出的点在当前图中不能互相接触,那么求得就是二分图的最大独立集那么ans=|V|−ans′ans=|V|-ans'#include <cstd原创 2015-07-28 15:28:03 · 433 阅读 · 0 评论 -
【图论】【二分图匹配】[POJ 3041]Asteroids
首先这道题目可以发现我们可以发现如果集合SS表示所有需要被覆盖的点的行和列的集合那么我们的任务就是从SS中选出一个子集使得size(S′)size(S')最小同时S′S'可以覆盖所有的点。那么如果我们选择了一个行那么和当前行相关的所有的列都有可能不被再选,那么将当前行和当前行上所有点的列连接,那么我们求得就是一个最小点的覆盖集,那么ans=ans′ans=ans'#include <cstdio>原创 2015-07-28 15:43:52 · 399 阅读 · 0 评论 -
【图论】【二分图匹配】[POJ 1325]Machine Schedule
可以发现如果把一条边看作一个任务,那么连接的就是两台机器的模式的编号,那么问题就转化成了最小的点覆盖问题,那么注意特殊处理存在一个任务在任意一台机器中是0的情况,因为一开始大家都是0,那么如果存在一个0直接不考虑这个任务就行了。#include <cstdio>#include <cstring>#include <algorithm>//#include <conio.h>using na原创 2015-07-28 15:57:02 · 474 阅读 · 0 评论 -
【图论】【二分图匹配】[POJ 3041]I'm Telling the Truth
直接连接每一个孩子和他们所描述的区间的每一个点,然后做一次最大匹配(因为要说谎的人最少),做的时候要倒着做,因为要最大方案,然后出来检查一下每一个点是否为匹配点,保存一下输出就好了。#include <cstdio>#include <cstring>#include <algorithm>//#include <conio.h>#include <iostream>#include <v原创 2015-07-28 15:32:18 · 466 阅读 · 0 评论 -
【图论】【二分图匹配】[POJ 1422]Air Raid
这道题目不用我说什么了吧,裸的最小路径覆盖问题(还有其他方法=》出门左转网络流)然后对于这道题目而言就是每一个点差点分成两个,一个进一个出,那么显然二分图匹配,每一个点只能一进一出,那么匹配出来的边的数量就是当前这个图上有多少条边可以缩成一个点,那么直接ans=|V|-ans'ans=|V|-ans'就好了。#include <cstdio>#include <cstring>#include原创 2015-07-28 15:50:41 · 551 阅读 · 0 评论 -
【图论】【二分图匹配】[HDU 2819]Swap
首先可以很容易的发现一个性质:无论怎么交换行和列,每一行每一列的元素数量始终不会改变,那么就像八皇后问题一样,只不过改成了棋盘上放了n个车不能互相冲突。那么每一个1的位置代表可以放一个车,每一个0的位置代表不能放车,那么可以发现如果在当前位置可以放个车并且放了的话,那么就不能在当前车的行和列上继续放车了,那么给行和列编号把有1的位置行和列连接起来,然后就做二分图匹配,因为是在棋盘上放车那么始终不会超原创 2015-07-28 15:24:39 · 738 阅读 · 0 评论 -
【图论】【二分图匹配】[Ural 1109]Conference
我的博客上的第一道Ural的题目呢。。 首先可以发现假设现在只有kk对人可以两两配对,那么剩下的必定还要建立n−2kn-2k条线路那么如果要ans=n−2k+kans=n-2k+k尽量小,那么我们需要的就是让n−kn-k尽量小就是让kk尽量大,那么久转换成了二分图的最大匹配问题#include <cstdio>#include <cstring>#include <algorithm>//#原创 2015-07-28 16:01:33 · 462 阅读 · 0 评论 -
【图论】[ACM]嗅探器
就是按照一个点作为根然后再这上面搞一下寻找割点,如果找到了,判断另一个点是不是在当前的割点的子树中(是相对于当前子树而言是一个割点)。如果在,那么就更新ans为最小值就行了#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <iostream>using namespace std原创 2015-07-22 09:11:38 · 491 阅读 · 0 评论 -
【图论】[Tyvj 1153]间谍网络
实际上就是先找出整个图里面的强连通分量,然后在每一个强连通子图里面,如果有可以受贿的罪犯,那么当前值就是最小的受贿的代价,否则就是INF, 然后在有向无环图中搞DP就好了。#include <cstdio>#include <algorithm>#include <stack>#include <iostream>#include <vector>#include <cstring>us原创 2015-07-22 09:06:26 · 426 阅读 · 0 评论 -
【图论】[POJ 2942]Knights of the Round Table
先找连通图,然后检查是否是二分图注意如果是在线的算法记得要清空Color数组因为存在一种情况儿子中含有两个连通图,那么自己儿子中就会存在一个割点已经被染了色,就有可能存在冲突。#include <cstdio>#include <algorithm>#include <stack>#include <iostream>#include <vector>#include <cstring>原创 2015-07-23 11:08:43 · 407 阅读 · 0 评论 -
【图论】【启发式搜索】[POJ 2449]Remmarguts' Date
实际上就是从T到当前节点的最短路的长度,因为首先要保证h(n) <= h*(n)且h(n)尽量接近h*(n)那么直接令h(n)=h*(n)就行了,然后注意每一次判断是否到达终点的时候要在每一次取出的时候判断,因为这个时候的最短路是经过优先队列的排序的。还有就是注意下S==T的情况默认的时候S到本身的最短路肯定是0,那么我们如果要求现在的最短路那么求得就是当前的次短路,让k++就好了#include原创 2015-07-23 17:17:04 · 511 阅读 · 0 评论 -
【图论】[BZOJ 1051]受欢迎的牛
题目问的是有多少个牛收到所有的牛的喜欢,因为这道题目具有传递性,所以在有向图上找出强连通子图,可以发现每个子图中的奶牛一定是互相喜欢的,所以不用考虑这样的情况(把每一个强连通子图找出,缩点)然后整个图就变成了有向无环图,那么同一个点必须受到其他所有奶牛的喜欢,那么它不能喜欢任意的除了自己这个联通子图的牛的其他牛(会形成环)所以统计一下是否存在出度为0的点就好了,但是如果存在两个或两个以上的出度为0的原创 2015-07-24 10:20:40 · 675 阅读 · 0 评论 -
【动态树】【Link Cut Tree】动态树的理解(入门)
引入现在我们需要一个数据结构满足支持以下的操作:两个节点连接(保证不出现环)两个节点断开求任意两个节点之间的区间和这样是不是很像树链剖分? 但是因为是动态的所以我们采用动态树来进行维护。样例现在给出一个样例,我们一下的解释都以当前样例为模板 我们有三个节点1 2 3 4,现在他们是连接在一起的如下图 为什么有一个虚线呢,这里我们用虚线表示假装连接在了一起(这里下文会讲到)操作首先我们原创 2016-04-07 17:50:27 · 7590 阅读 · 4 评论