
图论
jzq233jzq
这个作者很懒,什么都没留下…
展开
-
最大生成树+树链剖分——Luogu1967 [NOIP2013]货车运输
题面:Luogu1967 乍一看,网络流水题? 不存在的,有多组询问+起始点和终止点各不相同。。。 那不能用网络流还能用什么? 我们可以发现,题目所要求的那条路径一定在当前连通块的最大生成树上 这是一定的,否则找不到更大的一条路径里边的最小值比这条更大 所以就很容易想到Kruskal求出最大生成森林(图不一定连通)之后在树上进行操作了 具体什么操作呢?就是找两点间在树上路径的最小值即可原创 2017-06-02 20:27:22 · 401 阅读 · 0 评论 -
最小割——BZOJ1001 [BeiJing2006]狼抓兔子
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 啊我还能说什么。。。 dinic网络流直接过了 那个建无向边时两个方向都建边权大小,这个我一开始没注意。。。 也没怎么深究那个转成最短路的东西 其实啊,转成最短路估计比直接暴力打网络流要简单吧。。。#include<bits/stdc++.h>using namespace std;原创 2017-04-11 20:25:04 · 410 阅读 · 0 评论 -
图论——BZOJ4239 巴士走读
http://www.lydsy.com/JudgeOnline/problem.php?id=4239 我们的4.12模拟赛T3 我写了很久又调了很久的spfa最后被硬刚到80分再也上不去了。。。 思路是把每辆车看做点,如果一辆车能换乘另一辆车就连上一条边 代码就不贴了吧(反正也看不懂) 网上看题解发现一种非常神奇的做法 我们维护到达每个点的最迟出发时间d和乘上每辆车的最迟出发时间di原创 2017-04-13 20:22:21 · 680 阅读 · 0 评论 -
图论矩乘——Luogu2233 [HNOI2002] 公交车路线
https://www.luogu.org/problem/show?pid=2233 这个矩阵和floyd很像,可以说就是floyd吧 就是说每条公交车路线为初始矩阵啦~(相邻的点,不过5不要考虑因为到达5停止了的) 他需要n次从1到5,那么矩阵快速幂n-1次就好了 注意是n-1次!!!坑点 输出1到5的即可#include<bits/stdc++.h>using namespace原创 2017-04-18 08:32:07 · 823 阅读 · 0 评论 -
差分约束——Luogu1993 小K的农场
题面:传送门 第一题差分约束! 差分约束系统问题我们可以转化为建图求最短路等问题 像这题我们可以转化成求图中是否有负环 如果有的话那就不可行 然后建图时候的操作具体来看 如果是a-b>=c,那么就从a到b连一条长度为-c的边 如果是a-b<=c,那么就从b到a连一条长度为c的边 如果a=b那么连一条长度为0的双向边 具体如下: for(int i=1;i<=m;i++){原创 2017-05-10 21:32:41 · 356 阅读 · 0 评论 -
二分图匹配——BZOJ1854/Luogu1640 [SCOI2010]连续攻击游戏
题面:BZOJ1854 Luogu1640 这个题其实可以很显然地看成一个匹配问题 然后这个权值必须以1……n递增完美匹配 所以说这题不能用原来的网络流做了QAQ 现学Hungary感觉挺简单的 也是找增广路径,但是更简单 一个一个匹配过去的时候如果这个点已经被匹配那么dfs递归到原来匹配的点去修改原来的匹配,直到匹配完成 不过真的挺暴力的,听说时间比dinic慢好几倍呢~ 然后这种原创 2017-05-15 15:53:02 · 364 阅读 · 0 评论 -
二分图匹配——BZOJ1191/Luogu2319 [HNOI2006]超级英雄
题面:BZOJ1191 Luogu2319 Hungary匹配算法 思路同“[SCOI2010]连续攻击游戏”详见传送门 然后呢就是建边不一样一点,其他都差不多是一样的 注意到Luogu因为有SPJ,所以要求输出方案 其实很简单啊,就是在DFS时候记录的匹配对象就是啦~ 把这个输出就好了#include<cstring>#include<cstdio>#include<algori原创 2017-05-15 19:23:02 · 398 阅读 · 0 评论 -
树——BZOJ2435/Luogu1052 [Noi2011]道路修建
题面:BZOJ2435 Luogu2052 当时NOI选手应该都水过了吧。。。 我们把这棵树给建出来之后记录一下每个点的子树大小 然后观察每条边 可以发现这条边分开的国家数目加起来显然是总数,所以只要找一下两个顶点的子树大小的较小值,这肯定是某一边的国家数目 那么另一边只要总数减一下就好了 水……不过有坑点就是要开long long否则20分#include<cstdio>#inclu原创 2017-05-16 13:17:58 · 328 阅读 · 0 评论 -
最短路+离散化——BZOJ1967/Luogu2537 [AHOI2005]CROSS 穿越磁场
题面:BZOJ1967 Luogu2537 考虑到坐标范围非常大,但是矩阵数目很少 所以考虑离散化(离散化这个过程真的恶心) 离散化的时候要注意把矩形的边左右或者上下都给留下来,这样才能给机器人跑路 离散化之后呢跑一遍spfa,注意边界处理 就是说不能连续在一条边界上面走 至于两个矩形的边交叉处不必担心,因为往交叉处走的话必定不是最优的 最后输出终点的最短路径即可#include<io原创 2017-05-16 13:35:27 · 384 阅读 · 0 评论 -
二分图匹配——BZOJ1059/Luogu1129 [ZJOI2007]矩阵游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=1059 https://www.luogu.org/problem/show?pid=1129 我们可以很快的把这题转化成二分图匹配 具体我不多说了。。。 然后直接上模板(我发现我以前写的是假的dinic) 具体见前一篇飞行员匹配:http://blog.youkuaiyun.com/jzq233jzq/原创 2017-04-03 21:48:08 · 328 阅读 · 0 评论 -
SPFA——Luogu1073 [NOIP2009]最优贸易
https://www.luogu.org/problem/show?pid=1073 首先能够买进卖出的地点一定与起点和终点连通 我们可以从起点正向SPFA找出在可以走到的范围内能够买进的最小代价,然后从终点反向BFS找出哪些点能够走到终点,最后的答案是:max(本地代价[i]-买进最小代价[i])(i能够走到终点)然后SPFA模板改一下好了#include<bits/stdc++.h>us原创 2017-03-31 15:59:51 · 426 阅读 · 0 评论 -
K短路——BZOJ1975/Luogu2483 [SDOI2010]魔法猪学院
http://www.lydsy.com/JudgeOnline/problem.php?id=1975 https://daniu.luogu.org/problem/show?pid=2483 首先我们要想到把这题转化成求k短路 这个怎么说呢。。。先看题目一句话 iPig 的总能量是有限的,所以最多能够转换的样本数一定是一个有限数既然要求每种转换方式都不相同,那就不可能是最短路然后贪原创 2017-03-31 09:31:12 · 1253 阅读 · 0 评论 -
二分+dfs——51nod1307 绳子与重物
题面:51nod1307 看讨论都是说要卡掉O(nlogn)O(n log n)做法的,真是害怕 O(nlogn)O(n log n)就是二分断掉的那根线,check在这之前的绳子有没有断掉的,这个dfs遍历一遍记录重量就好了 然而我也很想知道O(n)O(n)的做法啊(并查集)!!! 这里只有O(nlogn)O(nlogn)的程序:#include <cstdio>#include <al原创 2017-09-17 21:36:33 · 245 阅读 · 0 评论 -
最长链——HDU4607 Park Visit
http://acm.hdu.edu.cn/showproblem.php?pid=4607题目意思是在公园里(就是一棵树)遍历k个点所需最短路径。这题用最长链做,可以选择两种方法: 1.一遍DFS(原谅本蒟蒻不会用这种方法写) 2.两遍BFS(本题用此方法)我呢是先离线用BFS把树中的最长链求出来,那好,问题来了,为什么要求原创 2017-01-22 10:28:36 · 382 阅读 · 0 评论 -
LCA——BZOJ1787 [Ahoi2008]Meet 紧急集合
http://www.lydsy.com/JudgeOnline/problem.php?id=1787被log坑死了。。。。。。23333这道题主线lca,把三个点两两算出lca,然后利用这个确定三人的集合点,计算距离求解,其他直接模板#include#include#include#include#define ll intusing namespace std;l原创 2017-01-22 15:15:59 · 328 阅读 · 0 评论 -
MST——poj1258 Agri-Net
http://poj.org/problem?id=1258本题似乎是一个很裸的最小生成树,加上多组数据。按照题目输入,这题用prim代码复杂度会低很多,因为输入就是一个现成邻接矩阵而我就写了一个kruscalkruscal基于贪心思想,将所有边按边权从小到大排序,然后一条一条加入,一开始各点在不同集合里,每加入一条边判断:如果当前边两个端点不在同一个集合里,合并集合并累加原创 2017-02-09 09:14:12 · 337 阅读 · 0 评论 -
最短路+DP——BZOJ1003/Luogu1772 [ZJOI2006]物流运输
http://www.lydsy.com/JudgeOnline/problem.php?id=1003 https://www.luogu.org/problem/show?pid=1772#sub 这题一开始,我乍一看,不会做啊(好吧其实这题还是很水的) luogu的题目标签说是DP啊,还有最短路 其实就是这样做的呀(后来发现真的很水) 因为在某一区间段时间内有码头会暂时关闭,所以我们原创 2017-03-13 09:24:03 · 353 阅读 · 0 评论 -
二分图匹配——Luogu2756 [网络流24题]飞行员配对方案问题
https://www.luogu.org/problem/show?pid=2756 二分图匹配的裸题 不过我不会匈牙利算法。。。。 于是我打了个dinic最大流过掉了 具体做法就是设一个超原点和一个超汇点, 然后超原点与每一位外籍飞行员连一条流量为1的边 超汇点与每一位英国飞行员连一条流量为1的边 然后跑一遍最大流就好了。。。记录方案我卡了很久 在此感谢lzq大佬指教(woc把我原创 2017-03-20 10:49:07 · 425 阅读 · 0 评论 -
最短路——BZOJ1656 [Usaco2006 Jan] The Grove 树木
http://www.lydsy.com/JudgeOnline/problem.php?id=1656 题目可能没讲清楚(或者没翻译清楚),这个树林是一个连通块 因为要绕树林一圈求最短路,我们可以任意取一棵树,然后向下画一条射线表明一条关键的分界线 每个点记录两个状态,1表示走过这条分界线一次,0表示没走过这条分界线 然后分别记录最短路 走过了才有可能绕原创 2017-03-29 22:25:02 · 628 阅读 · 0 评论 -
MST——BZOJ1016 [JSOI2008]最小生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1016 我们来分析一下这个最小生成树 如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 因为说相同边权的边的编号不影响最小生成树的大小,这个我们就可以算进多个答案了 所以我们可以先把边排序,跑一遍Kruskal记录一下相同边权的边对答案产生影响的数目还有起始终止位置(排序后)原创 2017-03-31 09:08:44 · 354 阅读 · 1 评论 -
LCA——Luogu3398 仓鼠找sugar
题面:传送门 首先两只仓鼠走最短路,所以先求出各路径的LCA 然后根据树上的一个很强的性质:每个点最多只有1个直接父亲节点 我们可以得出这样一个很强的结论:若两个路径相交,某一条路径的LCA一定在另一条路径上(很显然自己yy) 所以这个LCA肯定要么在另一条路径LCA的左边或者右边(LCA自己也算进去) 分类讨论一下即可 树剖LCA送上#include<cstdio>#include<原创 2017-05-18 20:53:20 · 302 阅读 · 0 评论 -
二分图匹配——Luogu3033 [USACO11NOV]牛的障碍Cow Steeplechase
题面:Luogu3033 我们把横着的线段分一组,竖着的线段分一组 然后把相交的线段连边即可 这样就形成了一个二分图 然后要说一下两个东西:二分图最小点覆盖:定义一个点能够覆盖以之为端点的所有边,定义点覆盖为覆盖图所有边的点集,最小点覆盖即为包含点数尽量少的点集。二分图最大独立集:独立集是两两没有公共边的点集,最大独立集即为点数尽量多的独立集。很明显这题要求的是二分图的最大独立集原创 2017-05-22 16:11:03 · 283 阅读 · 0 评论 -
费用流+构图——Luogu1251 [网络流24题]餐巾计划问题([HNOI2001]软件开发)
餐巾计划题面:Luogu1251 经典题啊。然后被HN省选拿去当原题考了??? HNOI传送门:BZOJ1221 Luogu2223 除了输入略有出入以外其他包括题面和思路算法都是一样的,所以放在一起写了= = (双倍经验啊韩寒会画画后悔画韩红) 首先可以发现这是一个最小费用最大流问题 建图比较麻烦。。。我们把图看成一个餐巾的清洗关系循环图 首先要保证每一天有一定数量的餐巾能够使用,我原创 2017-06-20 10:04:29 · 293 阅读 · 0 评论 -
欧拉回路+无极卡常——51nod1967 路径定向
题面:51nod1967 辣鸡出题人卡边表差评。。。 卡常数卡啊卡交了35发才过QAQ 当然底下还有,反正占了两页本题的主题思路就是求一个欧拉回路,我们把有向图暂时先看作无向图 首先第一问其实就是度为偶数点的个数 第二问我们把其他度为奇数的点两两连起来,然后整张图跑欧拉回路定向就好了啊 没有卡常的能看的代码:#include <cstdio>#include <algorithm>原创 2017-07-11 15:29:56 · 450 阅读 · 1 评论 -
Trie+拓扑排序——Luogu3065 [USACO12DEC]第一!First!
题面:Luogu3065 我们首先考虑一种情况,如果某一字符串的某个前缀是另外一个字符串,这个字符串不可能字典序最小。 所以我们来考虑相同前缀的问题。如果某一字符串字典序最小,和它同前缀的字符串的相同前缀之后一位字母的大小顺序就可以确定。如果这一系列的关系没有矛盾的话,这个串就可以是最小的,反之不行。 判断有无矛盾的话我们可以通过建连边跑拓扑排序解决。至于找前缀这种问题,交给Trie树就好了。#includ原创 2017-08-13 16:45:45 · 561 阅读 · 0 评论 -
二分图匹配——BZOJ1433/Luogu2055 [ZJOI2009]假期的宿舍
BZOJ传送门 洛谷传送门 这个题预处理好麻烦啊。。。题面也很绕 先说预处理吧,我们首先转成图,也就是把人和床分开变成二分图 具体怎么处理输入呢? 首先在校不回家的学生向自己的床连一条边, 然后所有人向认识的人里面有床的人的床连边 注意回家的学生要忽略。。。 最后每张床连向超级汇点,超级原点向每个在学校的人(包括学生和朋友)连边 然后就跑二分图匹配啦~原创 2017-04-25 10:14:36 · 443 阅读 · 0 评论 -
连通块——BZOJ4874 筐子放球
题面:BZOJ4874前天上午ZJOI2017集训讲课的妹子的第一题~ 看看很难的样子。。。 其实呢,把筐子看成点,球当边 然后求一下连通块,含奇数条边的连通块个数即为答案 为什么呢,看这个吧 ——课件里的 对就是这样#include<bits/stdc++.h>using namespace std;int nedge=0,p[400001],nex[400001],head[400001原创 2017-04-29 08:46:37 · 763 阅读 · 0 评论 -
图论矩乘——BZOJ1297 [SCOI2009]迷路
题面:BZOJ1297 又是一题我称之为“图论矩乘”的好题 因为每条边的边权只有1~9,所以我们考虑拆点 把一个点一分为十,方便记录距离 比如从a到b有一条边权为c的边 那么我们先把a里的距离1~c的点全部连上1,然后将a里的c和b里的1连上一条边 这样就做到矩阵里所有点的权值都是1了 然后就可以矩阵快速幂优化了 最后输出答案的时候还要再搞一下起点和终点#include<bits/stdc++.h原创 2017-05-02 14:50:13 · 392 阅读 · 0 评论 -
图论矩乘——BZOJ1706/Luogu2886 [USACO07NOV]Cow Relays
题面:Luogu2886 BZOJ1706 这题是图论的矩阵乘法吧。。。 我们把矩阵快速幂的思想和floyd结合一下 这里的矩阵乘法应该来说已经不算矩乘了。。。 确切来说是把乘法部分换成了floyd 然后矩乘n次(和公交车路线差不多) 计算最短路即为答案 然后这题需要离散化一下(我不知道不离散化能不能过。。。)#include<bits/stdc++.h>using namespace std;原创 2017-05-02 13:43:26 · 473 阅读 · 0 评论 -
Floyd+最大流——Luogu2402 奶牛隐藏
题面:Luogu2402 二分+最大流 看到这种题嘛直接做啊,首先Floyd求出两两之间最短路,然后我们考虑二分这个时间TT,接着建图 这个图啊首先把每个点拆成牛和棚,超级源点ss向每个点的牛连流量为牛数的边,每个点的棚向超级汇点tt连流量为容纳数的边,最后考虑牛到棚的边,如果点ii的牛到点jj的棚最短路<=T<=T,那么就连一条流量无限的边 最后用最大流判断一下流量是否是奶牛数就好了#in原创 2017-08-03 19:21:04 · 207 阅读 · 0 评论 -
欧拉路+STL——Luogu1333 瑞瑞的木棍
题面:Luogu1333 欧拉路的裸题。。。 很良心的没让你求路径,只让你判断是否能一笔画 那么直接dfs灌水一发记录每个点的度就好了 恶心就恶心在字符串。。。 没想过啥hash和trie,懒所以写了个std::map 发现T了 后来zhzh神犇教我了一种特技! C++11标准里有一个unordered_map,基本操作和map差不多 只不过map的维护方式是平衡树,所以里面的元素原创 2017-06-13 14:25:49 · 351 阅读 · 0 评论 -
最大流——BZOJ1189/Luogu3191 [HNOI2007]紧急疏散evacuate
题面:BZOJ1189 Luogu3191 首先我们预处理出每个空地到每扇门的最短时间 然后我们二分时间t,然后把每扇门拆成t个点 接下来建图:超级原点->每块空地(流1),每扇门的每一个时刻->超级汇点(流1) 然后对于每块空地,枚举能够在t时间内到达的门,连上边(流1,空地->门(对应的最短时间那个时刻点)) 然后等待的问题只要每扇门的某一时刻点向下一时刻点连上就行了(流INF) 然原创 2017-06-13 13:57:33 · 351 阅读 · 0 评论 -
费用流——BZOJ1877/Luogu2153 [SDOI2009]晨跑
题面:BZOJ1877 Luogu2153 把每个点拆成两个点(起点和终点不用拆) 给你的连边E{x,y,z}从x的第一个点连到y的第二个点(流1费z),然后每个点的第二个点连向第一个点(流1费0),这样就可以保证每个点只经过一次了 然后起点1开始跑最小费用最大流,到终点n,第一个天数的答案就是最大流,最短路就是最小费用#include <cstdio>#include <algorithm原创 2017-06-12 20:15:42 · 264 阅读 · 0 评论 -
二分图染色——Codeforces741C Arpa's overnight party and Mehrdad's silent entering
题面:cf741c 这题目名称真长。。。 简要题意:给出N(N≤10^5)对位置,要求构造一个长度为2N的01串,保证每个位置在N个限制中出现恰好一次。要求满足两个条件: ①不能出现连续的三个数位上数字相同; ②每对位置的数字两两不同。 (转自zzh的PPT) 因为有spj,所以我们只要随便构造一组就好了 具体怎么构造呢? 首先对于②其实很简单直接染不同颜色就好了 那关于①怎么搞?原创 2017-05-22 16:19:12 · 359 阅读 · 0 评论 -
LCT——BZOJ3669/Luogu2387 [Noi2014]魔法森林
题面:BZOJ3669 Luogu2387 LCT维护动态最小生成树 具体怎么操作呢,如果当前加边后树中形成了环,那么就把环上边权最大的边删掉,再把这条边加进去(当然啦如果这条边比环里的边都大就不要加) 这就是维护动态最小生成树,这些操作都可以用LCT来解决 LCT维护边权最大值(只不过维护的时候要记录的是编号) 然后最后答案的话在每次操作之后都询问一下从1到n的最大边权 这个也只要直接原创 2017-05-22 21:39:38 · 277 阅读 · 0 评论 -
最小割——BZOJ1412/Luogu2598 [ZJOI2009]狼和羊的故事
题面:Luogu2598 BZOJ1412 一个神奇的网络流 我们把狼和羊分开处理,从源点s向狼窝各连一条流量为INF的边 从羊圈向汇点t各连一条流量为INF的边 然后中间点的连边遵循以下条件邻居是狼不连边自己是羊不连边其他所有情况都连一条流量为1的边为什么呢,自己yy一下很快就知道了 然后直接跑最小割就好啦#include<cstdio>#include<cstring>#i原创 2017-05-23 09:52:09 · 239 阅读 · 0 评论 -
二分图匹配——BZOJ4554/Luogu2825 [Tjoi2016&Heoi2016]游戏
题面:BZOJ4554 Luogu2825 首先把图转成二分图 我们把行看作二分图的左边,列看成二分图的右边 然后每一行由“#”进行分段,也就是说,在两个“#”中间的是一段(包括最左边和最右边) 然后把“*”点看成连接行和列的边,这样就构图完成了 要想放最多,跑一遍二分图最大匹配就可以了 匈牙利算法:#include<cstdio>#include<cstring>#include<原创 2017-05-23 14:14:46 · 298 阅读 · 0 评论 -
最大流——Luogu2762 [网络流24题]太空飞行计划问题
题面:Luogu2762 网络流24题之二最大权闭合子图 ,首先建图 我们先从源点向每个实验连上权值为实验收益的边,再从每个器材向汇点权值为配置费用的边 然后每对配对方案连一条权值为INF的边 跑最小割即可,答案就是实验收益总和-最大流 具体证明不证了 两个比较容易炸的地方:读入:挺恶心的因为并没有告诉你到底配对的方案数有多少,请不要使用类似读入优化的读入方式(我试过好像这对于换行符不敏感。。。)原创 2017-05-25 10:21:29 · 314 阅读 · 0 评论 -
Tarjan+最长路——BZOJ1179/Luogu3627 [APIO2009]ATM 抢掠计划
题面:BZOJ1179 Luogu3627 首先题目意思就是让你求一条点权最长路,而且每个点的点权只能累加一次 但是发现图中有环,不能直接求。。。那怎么办? 那就把图缩成DAG不就好了,然后把所有缩在一起的点权全部加起来 先Tarjan缩点,然后重新建图,再跑最长路就可以了 最长路可以DP也可以直接BF,当然啦SPFA也是可以的啦 给SPFA的代码吧:#include<cstdio>#原创 2017-05-26 21:40:35 · 484 阅读 · 0 评论 -
差分约束——BZOJ2330/Luogu3275 [SCOI2011]糖果
题面:Luogu3275 BZOJ2330 差分约束入门题? 好吧是的,把约束条件转成图之后直接跑SPFA 怎么转就不说了吧。。。 然后输出-1的条件就是已知条件矛盾 这种矛盾有两种形式:直接和间接直接:给出条件中明确矛盾间接:SPFA跑最长路出现正环这两种情况直接判掉好了 最后答案就是所有的dist加起来就好了#include<cstdio>#include<cstring>原创 2017-06-02 14:04:14 · 335 阅读 · 0 评论