
图论
月光下的魔术师
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
最小环
最小环HDU1599题解求最小环的方法是,删掉任意两点i和j之间的边,求i和j的最短路,再加上i和j之间的边。 可用floyd算法求解。floyd算法的特点是当以k为中间结点时,以i和j为两端的点必定是经过1——k-1点的最短路。 我们假设最小环经过三点且满足,那么当floyd遍历到k时,已经知道了经过以i和j为两端的点经过1——k-1的最短路。那么最小环为。#include <bits/stdc++.h>using namespace std;int const inf =原创 2020-06-25 10:35:04 · 374 阅读 · 0 评论 -
POJ1985:树的直径
POJ1985题解:求树中最长路。从任意点出发BFS找最远的点,再从最远的那个点BFS找最远的点便是直径。代码:#include <cstring>#include <algorithm>#include <iostream>#include <cstdio>#include <queue>#include &...原创 2019-03-14 09:58:25 · 360 阅读 · 2 评论 -
PTA:L3-010 是否完全二叉搜索树
PTA:L3-010题解:先构建一棵二叉搜索树,注意是左边大右边小。判断是否是完全二叉树的方法是:如果是完全二叉树,那么层次遍历正好遍历n个结点,而且没有空结点。代码:指针版#include <bits/stdc++.h>using namespace std;int const N = 20 + 5;int a[N],n,pos;typedef struct N...原创 2019-03-10 10:23:46 · 386 阅读 · 0 评论 -
CF620E:DFS序+线段树+状态压缩
CF620E题解:建议大家先学会这两道题目POJ2777和POJ3321,之后的都简单了代码:#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>using namespace std;typedef long long ll;i...原创 2019-02-11 20:09:58 · 272 阅读 · 0 评论 -
HDU5877:Weak Pair(树状数组+离散化+DFS序)
Weak PairTime Limit: 4000/2000 MS (Java/Others)Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 5448Accepted Submission(s): 1564Problem DescriptionYou are given arooted...原创 2019-02-07 15:57:11 · 175 阅读 · 0 评论 -
洛谷P2634 [国家集训队]聪聪可可
题目描述聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏。他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树)。并且每条“边”上都有一...原创 2019-02-07 13:35:58 · 226 阅读 · 0 评论 -
POJ1741:树的点分治
TreeTime Limit:1000MS Memory Limit:30000K Total Submissions:31781 Accepted:10615 DescriptionGive a tree with n vertices,each edge has a length(positive integer less than 10...原创 2019-02-07 11:28:06 · 151 阅读 · 0 评论 -
洛谷P3806 【模板】点分治1
题目背景感谢hzwer的点分治互测。题目描述给定一棵有n个点的树询问树上距离为k的点对是否存在。输入输出格式输入格式:n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径接下来m行每行询问一个K输出格式:对于每个K每行输出一个答案,存在输出“AYE”,否则输出”NAY”(不包含引号)输入输出样例输入样例#1:2 11 2 22...原创 2019-02-07 11:23:24 · 207 阅读 · 0 评论 -
HDU5468:DFS序+容斥原理
Puzzled ElenaTime Limit: 5000/2500 MS (Java/Others)Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2103Accepted Submission(s): 731Problem DescriptionSince both Stefan an...原创 2019-02-06 17:04:54 · 188 阅读 · 0 评论 -
HDU3887:线段树+DFS序
Counting OffspringTime Limit: 15000/5000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3907Accepted Submission(s): 1322Problem DescriptionYou are given a...原创 2019-02-06 14:50:42 · 287 阅读 · 0 评论 -
HDU5692:DFS序+线段树
HDU5692:SnacksTime Limit: 10000/5000 MS (Java/Others)Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 5756Accepted Submission(s): 1306Problem Description百度科技园内有n个零食机,零食机之间通...原创 2019-02-06 13:56:25 · 248 阅读 · 0 评论 -
POJ3321:DFS序+线段树
POJ3321:Apple TreeTime Limit:2000MS Memory Limit:65536K Total Submissions:37298 Accepted:11132 DescriptionThere is an apple tree outside of kaka's house. Every autumn, a lo...原创 2019-02-06 12:26:03 · 261 阅读 · 0 评论 -
POJ2942:点连通分量+二分图染色
POJ2942题解:首先把不敌对的骑士连一条边,即原图的补图。 要开一个会议,得形成一个环。所以求点-双连通分量。 考虑每个连通分量,人数必须为奇数个。所以进行二分图奇偶染色。 这里有一个结论:二分图一定是偶圈。如果染色失败,那么说明是奇圈,满足条件。 还有一个结论:如果存在一个环为奇圈,那么整个连通分量的每一点都在某个奇圈当中。代码:#include <cstrin...原创 2019-03-14 17:03:10 · 252 阅读 · 0 评论 -
HDU3394:点-双连通分量
HDU3394题解:第一问为两个环都包含的边。所以要考虑是点-双连通分量。如果这个连通分量的边数m大于点数n,那么它每条边都在两个环当中。所以我们只需计算m > n的连通分量中边的条数即可。 这题不能拿边双连通分量判断,举个简单的日子。由(1,2)(1,3)(2,3)(3,4)(3,5)(4,5)构成的是一个边双连通分量,但是m > n却没有重复的边。 第二问为不构成环的边...原创 2019-03-14 16:56:29 · 386 阅读 · 0 评论 -
POJ1523:割点
POJ1523题意:问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分题解:求割点的题目。给的网络一定是连通的,割点就是在无向连通图的前提下。最后注意输出,每两个Case之间有个blank。代码:#include <cstring>#include <algorithm>#include <iostream>#includ...原创 2019-03-14 10:07:32 · 304 阅读 · 0 评论 -
HDU4612:桥
HDU4612题意:加一条边最多还有几座桥。题解:Tarjan缩点后,任意两点之间的边都是桥。我们只要求任意两点之间最多的桥,也就是树的直径。两次BFS即可。 从任意点出发BFS找最远的点,再从最远的那个点BFS找最远的点便是直径。 https://blog.youkuaiyun.com/forever_dreams/article/details/81051578树的直径可以参考这一篇,证明...原创 2019-03-13 22:20:20 · 184 阅读 · 0 评论 -
POJ3352:桥
POJ3352题解:至少加几条边,才能使任意两点之间至少有两条不同的路可以走,也就是边-双连通。题目中没有重边。 Tarjan缩点,再求出入度为1的点的个数s。要加的边为(s + 1)/ 2。【网上找的公式,找不到证明】代码:#include <cstring>#include <algorithm>#include <iostream>...原创 2019-03-13 22:16:29 · 187 阅读 · 0 评论 -
HDU2460 && POJ3694:桥
POJ3694题解:首先说一下,一模一样的题目在HDU和POJ上得到的结果与众不同。HDU在vector记录边AC,在POJ上用C++和G++不是TLE就是RE。最后改为邻接矩阵,C++1400ms左右AC,G++WA。 这一题要求桥,这和求个割点有一点不一样。如果(u,v)是桥,u是父节点,v是子节点,那么我们用v来记录桥。因为子节点有唯一的父节点,唯一确定一座桥。并且不用特殊考虑根节...原创 2019-03-13 15:21:59 · 252 阅读 · 0 评论 -
PO1144:割点
POJ1144题解:无向图求割点。割点满足的条件:如果是根节点,那么根节点必须至少有两个子树。 如果不是根节点,对于边(u,v)满足lowlink[v] >= pre[u],此时u为割点。也就是说,v只能通过u才能访问u以及祖先。代码:#include <cstring>#include <algorithm>#include <i...原创 2019-03-13 10:55:12 · 113 阅读 · 0 评论 -
POJ1236:强连通分量
POJ1236题解: task A:给出多少个点,能传遍所有的点。求入度为0的点的个数 task B:加上多少个点,才能成为强连通图。即求max(sum(outdegree == 0),sum(indegree == 0))。因为强连通图每个点必须要有出度和入度,所以把度为0的都补上。 当原图已经为强连通图时,要特判为1。 代码:#include <c...原创 2019-03-13 08:32:59 · 202 阅读 · 0 评论 -
连通分量模板
点-双连通分量:任意两点之间至少存在两条“点不重复”的路径。等价于内部无割点边-双连通分量:任意两点之间至少存在两条“边不重复”的路径。等价于内部无桥Tarjanvoid dfs(int u){ pre[u] = lowlink[u] = ++cnt; st.push(u); for(int i=0;i<G[u].size();i++){ int v = G[u][i...原创 2019-03-14 10:10:25 · 560 阅读 · 0 评论 -
POJ2186:强连通分量
POJ2186题解:找出一个强连通分量,判断其它边是否全部直接或者间接指向它 利用Kosaraju找强连通分量 如果找到了强连通分量A,下一个强连通分量B,在原有向图中,一定是A指向B。 所以最后一个强连通分量必定是没有指向任何强连通分量的,也就是有可能成为被崇拜的。 所以我们在最后一个分量开始在反向图中跑dfs2,如果每一个点都被遍历到了,说明所有的点都指向了它。 还有一种想法...原创 2019-03-12 21:10:43 · 233 阅读 · 0 评论 -
PTA:L3-007 天梯地图
PTA:L3-007 天梯地图题解:一开始题目没有看仔细,way = 1,代表单向,way = 0代表双向,不是没有路(很坑)。两次Dijkstra,然后保存路径。代码:#include <bits/stdc++.h>#define st first#define sd secondusing namespace std;typedef pair<...原创 2019-03-10 10:25:52 · 539 阅读 · 0 评论 -
HDU1839:最短路
HDU1839题意:每条边都有容量和时间把矿物从1运到n,并且不超过规定的时间T。且路线的容量要最大。这一条路线的容量为容量最小边的容量题解:把每一条边的容量进行排序,然后按二分容量,枚举容量最小的边。走容量≥limit的边。一开始我用邻接表,然后内部排序,但我没有考虑到邻接表利用边的编号,所以这样一排序就乱了。所以只用记录容量,然后对容量进行排序,再二分。代码:#include...原创 2019-02-18 13:00:40 · 249 阅读 · 0 评论 -
POJ1062:最短路
POJ1062题解: 如果a可以代替b,那么就连一条从a到b的边,权值为用b代替a,a需要的价格。 再加一个点n+1,n+1连接所有点,权值为旅行家直接花钱的价格 最后求的便是从n+1到1的最短路,并且路上结点的权值差绝对值小于等于M 一开始我是记录路径,保存以前路上的等级最大值和最小值,但是行不通。后来参考了百度,原来可以枚举区间。枚举的区间必须包括酋长,...原创 2019-02-18 10:49:35 · 333 阅读 · 0 评论 -
HDU1217:最长路
HDU1217题意:询问是否存在一种货币交换,使最终的收益增加。题解:注意货币交换是单向的。floyd算法求最长路并且进行判环代码:#include <bits/stdc++.h>using namespace std;int const N = 30 + 10;double const inf = 0x7f7f7f7f;map<string,int>...原创 2019-02-15 16:41:38 · 195 阅读 · 0 评论 -
POJ2472:最长路
POJ2472题意:求从1到n不被逮捕的概率最大题解: Dijkstra算法不能直接求最长路。按照Dijkstra求下面的从1到2的最长路,会发生错误。必须取反再求。1—2 2,1—3 1,3—4 1,4—2 1。(空格后面是边权) 但是这一题可以用Dijkstra求最大值(47ms)。因为概率≤1,所以越乘越小。比如现在到b点的概率p1为最大,就做标记。那么从其它点跑到b...原创 2019-02-15 16:39:22 · 1227 阅读 · 0 评论 -
HDU1595&&HDU3986:最短路
HDU1595HDU3986题意:每删除一条边,可能会有一条从1到n的最短路,求最长的最短路。题解:hdu1596有重边,hdu3986无重边。枚举每一条边,太暴力了,肯定TLE。那枚举哪些边好呢?显然是在没有cut边之前的最短路上的边。why?因为非最短路的边,删去了对最短路没有影响。第一次Dijkstra记录最短路上所有的边,然后每次去掉一条边,Dijkstra一波 ...原创 2019-02-14 22:44:25 · 208 阅读 · 0 评论 -
HDU2112:最短路
HDU2112题解:一道题看起来很简单的题目,wa了7次。(┬_┬)1、起点和终点可能相同。但是不要相同立刻contiue,因为后面还有输入。2、两个车站之间是来回的,不是单向的。不知道哪个评论说是单向的。代码:#include <bits/stdc++.h>using namespace std;typedef pair<int,int>pii;i...原创 2019-02-13 21:18:27 · 238 阅读 · 0 评论 -
HDU1535:最短路
HDU1535题意:从1号车站到所有车站,再从所有车站到1号,花费总和最少为多少?注意公交车是单向的。题解:从1到所有车站就一次dijkstra,然后回来怎么做呢?就是把所有的路反向,再走一次dijkstra。这样子原先你可以从1到其它结点的路不可以走了,但是从其它结点到1的路就通了。内存有点紧G++内存超了,但C++AC标准的FIFO的Dijkstra代码(MLE)#inc...原创 2019-02-13 21:16:44 · 227 阅读 · 0 评论 -
HDU3790:最短路
HDU3790题解:这一题和POJ1679很像,但是简单一点。POJ1679是要求次短路,所以队列里维护的是次短路。这里首要维护的还是最短路。如果发现最短路,就更新最短路并且更新最小费用。如果发现最短路和之前相同,那么比较最小费,在更新一下。一开始G[N]忘记更新,狂wa。代码:#include <bits/stdc++.h>using namespace std;...原创 2019-02-13 14:37:20 · 244 阅读 · 0 评论 -
POJ3255:次短路(Dijkstra)
POJ3255题解:我感觉这一题有一点难理解,可能是我太菜了,虽然在Dijkstra上改进了一下,但是还有一些细节要注意。首先队列维护的是次短路,每次更新都是贪心地找最短的次短路。所以条件判断 if(d1[u] < p.first)变成了if(d2[u] < p.first) 。其次最短路算法中,修改最短路用d1[e.to] = d1[e.from] + e.dist,这里...原创 2019-02-12 19:07:52 · 263 阅读 · 0 评论 -
51nod1649:最短路(Dijkstra)
51nod1649题解:这一题看起来很难,其实稍微思考一下会发现就是一次Dijkstra。如果1和n之间无铁路,那么就一定有公路,那么汽车就一步到达,只需求火车的最短路。如果存在铁路,那么火车一步到达,只需求汽车的最短路。代码:#include <cmath>#include <cstdio>#include <vector>#inc...原创 2019-02-12 17:06:02 · 191 阅读 · 0 评论 -
hihocoder1328:BFS最短路+状态压缩DP
hihocoder1328题解:这一题还是挺不错的,不是常规的BFS求最短路,而要加上钥匙的状态压缩。共三个状态。因为k<=5,钥匙的状态进行状态压缩,用v[x][y][k]表示在坐标(x,y)身上钥匙状态为k的步数每次走到有钥匙的地方,那么更新钥匙状态;走到锁的地方,判断是否有开这把锁的钥匙。代码:#include <bits/stdc++.h>usin...原创 2019-02-12 16:03:23 · 235 阅读 · 0 评论 -
hihocoder 1093:最短路(SPFA)
hihocoder 1093题解:spfa裸题目,存在重复的边和环没关系。代码:#include <bits/stdc++.h>using namespace std;typedef pair<int,int>pii;int const inf = 0x7f7f7f7f;int const N = 100000 + 10;int const M = ...原创 2019-02-12 13:50:28 · 242 阅读 · 0 评论 -
hihocoder 1089:最短路(Floyd)
hihocoder 1089题解:最短路Floyd裸题代码:#include <bits/stdc++.h>using namespace std;typedef pair<int,int>pii;int const inf = 0x7f7f7f7f;int const N = 100 + 10;int n,m,s,t,d[N];int mp[N]...原创 2019-02-12 13:12:33 · 194 阅读 · 0 评论 -
hihocoder1081:最短路(Dijkstra)
hihocoder 1081题解:Dijkstra裸题,有重复的边和环没关系。代码:#include <bits/stdc++.h>using namespace std;typedef pair<int,int>pii;int const inf = 0x7f7f7f7f;int const N = 1000 + 10;int n,m,s,t,d[...原创 2019-02-12 13:02:00 · 138 阅读 · 0 评论 -
最短路算法
Bellman-ford特点:单源最短路可判环思路:如果不存在负环,那么经过n-1轮松弛可以找到所有的最短路。如果第n轮还可以松弛,那么说明存在环。算法的过程全部演示了一遍,可以加深影响https://www.bilibili.com/video/av43217121证明:参考:https://www.cnblogs.com/willaty/p/8243881.html...原创 2019-02-12 11:31:03 · 261 阅读 · 0 评论 -
CCF:201812-4数据中心
题解:题目很高大上,实际上就是求一课最小生成树。模板题目。最后记录树中最长的边。代码:#include <bits/stdc++.h>using namespace std;int const N = 50000 + 10;int const M = 100000 + 10;int const inf = 0x7f7f7f7f;int n,m,root;int ...原创 2019-03-11 17:15:59 · 122 阅读 · 0 评论 -
HDU3367:最大生成树
HDU3367题意:这一题题目有点绕,这里不是简单地找最大生成树,这课树还可以最多有一个环。然后我们要找出这么多树构成的最大森林。题解在代码中给出了。代码:/*从大到小排序边1、如果根结点相同,如果没有环,就合并,并标记有环。2、如果根结点相同,有环了,就不合并。3、如果根结点不同,如果两边多有环,就不合并。4、如果根结点不同,两边只有一个环,那就合并,打上标记。5、如...原创 2019-02-13 13:19:11 · 424 阅读 · 0 评论