![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
Zolrk
这个作者很懒,什么都没留下…
展开
-
封锁阳光大学【二分图染色】洛谷P1330
从题目中可以看出,能够完全封锁的图一定是一个二分图 只要占领一个点集(U或V)就可以封锁全部的道路 最少的河蟹数量就是较少的那个点集 上图中最少需要4只河蟹(V集合) 用dfs染色法判断是否为二分图,再用两个变量来记录不同颜色的点数 二分图中,若染源点为1,则源点的子节点染色为2,源点的,子节点的子节点染色为1 如果遇到了子节点和父节点颜色相同的情况,则无法构成二分图 因为如果颜色原创 2017-07-22 09:01:23 · 368 阅读 · 0 评论 -
关于“使用算法”的一点小思考 (洛谷P1608 路径统计 - 最短路计数
最短路计数这个问题,我一开始想的是,先SPFA求最短路d,然后暴力找所有路径,加上最优性剪枝,看等于d的路径有几条。。。但是考虑到我已经写了SPFA了,并且一个算法并不一定只能解决一个问题,把这个SPFA改一改可能会更好一点,于是考虑对SPFA进行修改,因为SPFA实质上就是不断松弛路径,所以可以同时维护一个数组dis,表示到点的最短路路径条数,这样就会好很多 所以在使用算法上,不一定要把算法考...原创 2018-07-21 16:03:50 · 256 阅读 · 0 评论 -
洛谷P1119 灾后重建 - Floyed
对floyed的过程仔细分析,发现其实是一个以“除去起点和终点,中间经过的点编号的最大值”为阶段的DP 由于这道题保证了从0~N-1城市是依次修建完成的,可以说在i城市修建完成之前,i后面的城市都不可经过,又因为询问的t是递增的,所以每次的询问可看作对不同阶段的最短路查询,按照阶段来floyed就可以了,注意判-1#include <algorithm>#include &...原创 2018-07-28 13:02:15 · 211 阅读 · 0 评论 -
POJ2728 Desert King - (0/1)分数规划
题目求一种方案,使得图全连通并且所有边费用与距离之商最小 ∑i∈ecosti∑i∈ecosti\sum_{i∈e}cost_i除以∑i∈edisi∑i∈edisi\sum_{i∈e}dis_i最小 可以考虑二分求解 可以假设这个值小于等于L时存在一个解,然后检查是否存在这个解,如果不存在说明L取小了 问题是为什么要假设“存在”,事实上如果假设“任意”,那么就要检查每种可能都要小于,就很麻烦...原创 2018-08-07 19:52:13 · 179 阅读 · 0 评论 -
洛谷P2921 [USACO08DEC] 在农场万圣节 Trick or Treat on the Farm - 拓扑删链
仔细分析一下题目,换不同角度来看待问题 当把题目给的关系看做图的边的时候,会发现这其实是一个n个点,n条边的图,而且每个点的出度为1(一开始我画成树了。。。导致很长时间没发现自己错了,事实证明画图找例子是要在正确认识题意下的,可以先根据样例画个小图(这样不会丢失题意,再把这个图按题意拓展大点)最重要的是敏感地发现这道题和环密切相关,题意也是在求一个环,只要找到环,算出环的大小,在环内的点答案...原创 2018-08-15 11:41:38 · 233 阅读 · 0 评论 -
洛谷P1341 无序字母对 - 欧拉路/欧拉回路
判断欧拉路:图中只有两个度数为奇数的点,其余均为偶数 欧拉回路:图中所有点度数均为偶数 欧拉图:图是连通的并且存在欧拉回路欧拉回路其实就是欧拉路的两头连了边这道题可以把给出的字母对的两个字母连一下无向边(一开始我想的是把字母队首位可连的处理一下。。。但是果然太麻烦,输出也费事,常常一眼看错题意,当做法太麻烦时,考虑是不是想多了想错了,找找反例,说不定没往正解的路子上走) 然后把字符...原创 2018-08-16 08:35:08 · 238 阅读 · 0 评论 -
洛谷P3398 仓鼠找sugar - lca - 树剖
两人走路方向不同,可能一个由底到顶 一个由顶到底,但因为找的是公共点而不是相遇点,所以没有影响 先想想这个题的过程,过程有什么坑点,把坑点及时记录在注释上 这样打代码的时候不会忘 注意是棵树,是棵树 找不同情况/反例时切记贴合题意 树是种优美的结构,一个点只有一个父节点 你不能从把一个另点插到这个点上方 总之 不能有如下情况应该由特殊例子找到普遍规律,再把普遍规律应用于一般例子来...原创 2018-08-13 21:46:21 · 223 阅读 · 0 评论 -
POJ3669 Meteor Shower 流星雨【预处理】【广搜】
这个题有个坑点…就是流星虽然只能炸到300 X 300的区域,但是Bessie可以走到第一象限的任何地方,所以MAXSIZE 开大点吧…#include #include #include #include #include #include #define DEBUG(x) std::cerrconst int MAXM = 50000 + 1;const int MAX原创 2017-09-24 21:49:56 · 276 阅读 · 0 评论 -
P4880 抓住czx - 最短路
首先求一遍最短路,若我们最后在某个节点能抓到czx,那么我们从起点到这个节点一定是走的最短路,没有必要走更长的路,那样只会更加浪费时间。 而我们到这个点的时间dis[x]是否一定是czx在这个点停留的时间区间【l, r】内? 不一定吧,我在l之前到也是可以的,因为我可以停下等着,但在r之后到就不行了 题意的“抓”其实有一种误导的感觉,不过样例很好,提示了另一种情形:czx自己找到我们 所以...原创 2018-09-10 10:16:59 · 221 阅读 · 0 评论 -
树链剖分模板
注意 求子树时,要用子树dfs序连续这个特性,但是不能用如下方法(sub表示x的子树中最大的dfs序):void dfs2(int x, int t) { top[x] = t; dfn[x] = ++cnt; subcnt = max(subcnt, cnt); rnk[cnt] = x; sub[x] = cnt; if(!son[x]) ...原创 2018-09-14 07:13:12 · 132 阅读 · 0 评论 -
P4427 [BJOI2018]求和 - 预处理 - 树上前缀和/树剖
因为k是动态的所以难以维护,但是发现每个点的权值是深度,但是发现了又如何。。。还是难以动态维护。 但是发现k太小了。。。时限又比较大,直接预处理出来1~50次方和,线段树搞一下就行了#include &amp;amp;amp;amp;lt;algorithm&amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;gt;#include &a原创 2018-09-14 08:25:00 · 359 阅读 · 0 评论 -
P1993 小K的农场 - 差分约束
看出不等式之后,通过移项套模型大概不等式模型是这样的:xv&amp;lt;=xu+w(u,v)x_v &amp;lt;= x_u + w_{(u, v)}xv&lt;=xu+w(u,v)xv−xu&amp;lt;=w(u,v)x_v - x_u &amp;lt;= w_{(u, v)}xv−xu&lt;=w(u,v)从减数到被减数连边长得和最短路的三角形不等式似的所以求解也...原创 2018-10-02 16:10:42 · 227 阅读 · 0 评论 -
不完全浅析Tarjan求强连通分量(SCC)
定义dfn[]为每个点的时间戳(搜索次序),low[]为每个点的所能追溯到的,最低dfn的祖先的dfn,也就是最浅祖先 证明我真的不会,只能自己YY,不确保说的每句话都是正确的,如果我的分析有错误请一定要指出来!!! 先走dfs。一个有SCC的图一定有环,所以当搜索到一个已经到过的点时,我们就找到了一个环,此时这个环上所有的点一定都强联通(就好比地球是圆的,所以一直沿某个方向是可以回到起点的),原创 2017-09-25 20:13:26 · 395 阅读 · 1 评论 -
P1726 上白泽慧音 - 强连通分量模板
虽然是模板但是却提醒我有向图一定要试着从每个点出发,不仅仅是因为图不一定连通,更有可能是只从1号点出发哪也去不了的情况#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <stack>using namespace...原创 2018-10-03 16:21:36 · 175 阅读 · 0 评论 -
USACO15JAN 洛谷P3116 Meeting time - 搜索 - 剪枝
数据太弱???加个剪枝就过了??? PS:wa了无数遍后,我发现自己的dfs写错了。。。。。 正解是DP。。。回来我会填坑的 原因看注释吧#include &amp;amp;lt;algorithm&amp;amp;gt;#include &amp;amp;lt;iostream&amp;amp;gt;#include &amp;amp;lt;cstring&amp;amp;gt;#include原创 2018-07-25 13:17:47 · 158 阅读 · 0 评论 -
二分图学习笔记
二分图判定使用黑白染色法,把与一个点相连的所有节点都染成与这个点不同的颜色,这样点就会被分为黑与白两个集合,如果说染色时出现了冲突,比如两个相连的点颜色均为黑色,那么黑点集中出现了边,此图便不是二分图二分图最大匹配任意两条边都没有公共端点的边集成为图的一组匹配,二分图中,对于包含边数最多的一组匹配称为二分图的最大匹配。匹配上的点称为匹配点,相应的有匹配边,非匹配边/点增广路...原创 2018-07-18 11:13:02 · 218 阅读 · 0 评论 -
Noip2015 运输计划 【二分答案】【差分】【LCA】
代码写的难看=。=#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#define max(a, b) (a) > (b) ? (a) : (b)inline void read(int &x) { x = 0; char c = getchar(); while(c<原创 2017-08-15 09:57:02 · 347 阅读 · 0 评论 -
Poj3662 Usaco2008JanSilver Telephone Lines
题目大意 给定N个点P条边的无向图,官方提供k条免费边。求如何去掉免费边,使剩下的边之中最大的边权最小,输出最大的边权这题…最大的最小,很容易想到二分…而且这些边一定构成了最短路。原创 2017-09-10 21:49:06 · 391 阅读 · 0 评论 -
Dijkstra模板
注意几点1.看清楚是有向还是无向图 2.dis初始值设为0x3f3f3f3f可能会不够 还是设为0x7fffffff吧#include &lt;cstdio&gt;#include &lt;queue&gt;#include &lt;cstring&gt;#include &lt;algorithm&gt;const int MAXN = 100000 + 1原创 2017-09-23 09:26:02 · 253 阅读 · 0 评论 -
NOIP2014 联合权值 - 图论
两个问题都需要按照每个节点的相邻点来思考解法。 把符合题目要求的,可产生联合权值的有序点对,称为联合点。第一问 每个节点的子节点(相邻点)之间,彼此组成联合点,具体看图。 可以比较每个节点的相邻点的权值,得到最大子节点和次大子节点。 他们的联合权值就是这个节点所能发现的最大联合权值。 然后更新答案ans=max(ans,max1∗max2)ans=max(ans,ma...原创 2017-07-13 17:02:17 · 601 阅读 · 0 评论 -
POJ 2762【强联通缩点】【拓扑排序】Going from u to v or from v to u?
题目大意是,判断一个有向图中所有的任意两点x,y,是否满足,从x可以走到y 或者 从y可以走到x很显然,同一个SCC中的所有点一定满足这个条件,当同一个SCC中的所有点要么同时选要么同时不选的时候,就可以缩点了。缩点的方法就是给每个点加一个强联通分量编号(染色),然后tarjan结束后考察每一条边,若某条边的两头不是同一个颜色,就加一条新边。缩点后的图一定是一个DAG(有向无环图),在这张新图上可以原创 2017-09-25 20:34:58 · 322 阅读 · 0 评论 -
Poj3660 Cow Contest 【传递闭包】
Rank这种东西…根据定义来说就是个体在整体中的排名,那么一定需要知道这个个体和整体的关系才能知道Rank。 比如说,只有知道其他所有人的成绩,才能知道自己的排名是多少 那么问题转化为求有多少个能够 确定和其他所有点的关系 的点 传递闭包跟Floyed基本相同…就是把松弛操作改成了传递关系 需要注意的是,有关系指的是打败和被打败,要有两个判断if(a[i][k] && a[k][j]) a[原创 2017-09-20 21:31:27 · 260 阅读 · 0 评论 -
洛谷P3385 负环 - bfs-spfa判负环
松弛操作时,当一个点的子树结点可以回到这个点的时候,出现负环#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define debug(x) cerr << #x << "=" << x << endl;const int MAXN = 200原创 2017-10-29 18:55:11 · 390 阅读 · 0 评论 -
Noip 2009 最优贸易 - BFS
题目要求一个最大差值,然而买入必须要在卖出之前,也就是说某些单向边会影响答案设dis1[i]为从起点到i点的最低价格,dis2[i]为终点到i点的最高价格(均包括i点),则dis2[i] - dis1[i]就是以i点为两次交易中间点时的收益一个点能进行交易的条件是1能到这个点,然后这个点又能走到终点,若我们正向BFS可到达这个点,说明这个点可买入,若反向BFS可到达这个点,则说明这个点可卖出其实就是原创 2017-11-07 15:07:09 · 296 阅读 · 0 评论 -
Noip2016 天天爱跑步【LCA】【差分】
从题目部分分的提示中可以获得很多想法,比如说第六个点树退化成一条链,第九个点所有的s=1,第15个点所有的t=1 然后思考一下,每一条最短路都是一条链,LCA必定存在于每一条链上,每条链可以分为 s->lca和lca->t两部分 设deep[i]为i点的深度,dis为S到T最短路 先假设某个w[i]可以看到玩家,那么w[i]满足的等式是 {deep[S]=w[i]+deep[...原创 2017-09-09 11:52:36 · 371 阅读 · 0 评论 -
Tyvj 1391 走廊泼水节 - 生成树 - 完全图
题目大意: 给定一个完全图的唯一最小生成树,求这个完全图最小的边权和 完全图:结点两两之间都有边的图首先我第一回做的时候写了个map骗分的做法。。。我以为N2logNN^2logN可以过40%数据的,然而被多组数据卡时间了Orz 但!是!map仍然是一个高速骗分利器 所以我先总结下map的用法 map是一类容器,他可以做到哈希表能做的事,其内部由红黑树实现,因此效率十分高。 然后map是原创 2017-10-20 20:15:50 · 409 阅读 · 0 评论 -
Noip2013 货车运输 - 生成树 - 倍增
这道题是一类树的瓶颈问题。题意是求两点路径上的最小的最大边(在图中,两点之间路径不只一条),那么肯定这条最大边存在于最大生成树上。因此我们可以将图的问题转化为树上问题。树上两点之间的路径一定经过lca,因此这条路我们可以由lca分成两条链。然后就是更新答案,比较暴力的想法是从两个点分别走到lca,然后更新答案。这样复杂度有点高,我们想想如何优化暴力走路的过程。没错,用倍增,把O(n)复杂度的走路优化到O原创 2017-10-22 17:40:37 · 258 阅读 · 0 评论 -
Vijos1046 观光旅游 - 最小环模板
如果能确定只有简单环的话可以直接tarjan 最小环的floyed解法: 若为有向图:floyed后直接找一个最小的dis[i][i]即可本题为无向图: 大体思路是根据dp的性质 假设k连接i,j 形成首尾相接的环,此时由于dp的阶段性k还没有被放到最短路里,所以这样一定是环,为什么呢,因为无向图的话,想象一条链,从头走到尾再走回头,floyed过程中就会更新dis[i][i] ...原创 2017-10-24 09:37:58 · 438 阅读 · 0 评论 -
BZOJ2763 飞行路线 - 分层图 - 最短路
我们把原图复制出k层,而题中给的k次免费机会,就是连接不同层次图的道路,并且遍权为0。 使用免费机票的时候,就跳到上面那一层,并且没有任何花费。 这样求一遍最短路就可以得到使用免费机票次数小于等于k的最短路 也可以从dp的角度理解: dp[v][i] = min(dp[v][i], dp[u][i] + c) 同层图转移 dp[v][i+1] = min(dp[u][i], dp[v]...原创 2018-03-14 19:23:58 · 368 阅读 · 1 评论 -
P2055 [ZJOI2009]假期的宿舍 - 二分图最大匹配
把人和床分开考虑,题目说每个人只能睡和自己直接认识的人的床,就是一种边的关系,但是并不是人与人,实际上人与人之间连边是很难处理的,但是如果把人和床连边,就是一张二分图,左右两边分别是不同的东西,然后求一下最大匹配就好了没思路的时候换换角度,看能不能搞出什么“新东西”来注意多组数据不超时的情况下能用memset尽量用,有时候感觉某个数组可以不清空但实际上是需要清空的还有注意连边的时候没那么简单...原创 2018-10-05 16:31:04 · 218 阅读 · 0 评论