图论
如题
Yuhan の Blog
这个作者很懒,什么都没留下…
展开
-
洛谷 P4017 最大食物链计数(求拓扑排序数)
题目链接:https://www.luogu.com.cn/problem/P4017思路:一道裸的求图的拓扑排序数量的题代码:#include<bits/stdc++.h>using namespace std;const int maxn = 5005;const int mod = 80112002;int n, m; queue<int> que;int deg[maxn], cnt[maxn]; //入度 答案计数 vector&l原创 2021-04-16 18:41:18 · 292 阅读 · 0 评论 -
蓝桥杯 PREV-13 网络寻路(dfs)
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T36思路:每一个点都可以作为起点,用dfs遍历路径条数;代码:#include<bits/stdc++.h>using namespace std;int n, m, s;long long ans;vector<int> G[10005];bool v...原创 2020-03-09 14:12:11 · 155 阅读 · 0 评论 -
蓝桥杯 PREV-25 城市建设(最小生成树)
题目链接:PREV-25 城市建设思路:1.先考虑没有码头的情况,使用kruskal算得最小生成树,但是需要检查一下所有点之间是否连通;2.而后考虑建码头的情况,所谓建码头的城市均可以互相连通,我们可以设立一个虚点,城市到虚点的边权即是建造码头的费用,再使用kruskal算法算得最小生成树的最小权值;3.我们取两种情况的最小值(注意第一种情况要保证连通);4.在写最小生成树的时候...原创 2020-02-29 17:32:17 · 224 阅读 · 0 评论 -
蓝桥杯 PREV-49 发现环(链表)
题目链接:PREV-49 发现环思路:1.我们可以采用依次去掉度数为1的点的方法来寻找图中的环;2.遍历的过程中可以采用链表方式,以减少时间开销;代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1e6 + 5;int n, nex[maxn], deg[maxn];vector...原创 2020-02-20 15:27:36 · 159 阅读 · 0 评论 -
蓝桥杯 PREV-9 大臣的旅费(求树直径)
题目链接:PREV-9 大臣的旅费思路:根据题意,该国路线图是一颗树,则题意是求此树的直径;用两次dfs/bfs即可求得一棵树的直径;代码:#include<bits/stdc++.h>using namespace std;struct edge { int to, cost; };vector<vector<edge> > G;...原创 2020-02-15 16:43:26 · 235 阅读 · 0 评论 -
团体程序设计天梯赛 L3-007 天梯地图 (30分)(dijkstra变形)
题目链接:L3-007 天梯地图 (30分)思路:这是PAT甲级原题…原本想直接复制之前的code,奈何博主觉得自己以前写的太乱了,遂重新写了一遍;这道题使用两次dijkstra即可,但是需要稍微改变一下,例如求最快最短的情况下,慢的需要更新为快的毋庸置疑,同时同样快的应该考虑路径长度是否需要更新;代码:#include<bits/stdc++.h>using ...原创 2020-01-30 14:13:59 · 476 阅读 · 0 评论 -
团体程序设计天梯赛 L3-010 是否完全二叉搜索树 (30分)
题目链接:L3-010 是否完全二叉搜索树 (30分)思路:可以模仿线段树建树的方式,用数组建树,然后遍历代码:#include<bits/stdc++.h>using namespace std;#define l (u << 1)#define r (u << 1 | 1)int n, tree[(1 << 20) ...原创 2020-01-29 20:21:44 · 223 阅读 · 0 评论 -
团体程序设计天梯赛 L3-005 垃圾箱分布 (30分)(Djikstra求最短路)
题目链接:L3-005 垃圾箱分布 (30分)思路:按题意用Dijkstra求得每个垃圾箱到所有居民的最短路径,这些最短路里最短的一个就是垃圾箱到所有居民的最短路,此时我们求得所有垃圾箱里这个最短路最长的一个即可;如果存在距离大于Ds的要舍去,得到多个答案需要按题意筛选出唯一的一个输出;代码:#include<bits/stdc++.h>using namesp...原创 2020-01-29 14:58:26 · 409 阅读 · 0 评论 -
团体程序设计天梯赛 L2-013 红色警报 (25分)
题目链接:L2-013 红色警报 (25分)思路:每失去一个城市,dfs一遍,检查当前的连通块个数,如果比之前多,则需要警报;代码:#include<bits/stdc++.h>using namespace std;const int maxn = 505;bool lost[maxn], vst[maxn];vector<int> G[ma...原创 2020-01-20 19:26:44 · 252 阅读 · 0 评论 -
团体程序设计天梯赛 L2-006 树的遍历 (25分)
题目链接:L2-006 树的遍历 (25分)思路:先建树再bfs即可代码:#include<bits/stdc++.h>using namespace std;const int maxn = 2345;int n, post[maxn], in[maxn];vector<int> tree[maxn];void dfs(int x, int...原创 2020-01-19 20:00:51 · 305 阅读 · 0 评论 -
团体程序设计天梯赛 L2-026 小字辈 (25分)
题目链接:L2-026 小字辈 (25分)思路:对每个祖先dfs,同时维护深度即可;代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1e5 + 5;int d;vector<int> chd[maxn], rcd[maxn];void dfs(int u, int ...原创 2020-01-15 22:05:45 · 416 阅读 · 0 评论 -
团体程序设计天梯赛 L2-001 紧急救援 (25分)(最短路径)
题目链接:L2-001 紧急救援 (25分)思路:使用dijkstra算法来求最短路,其中记录最短路条数、以及每个点所能聚集到的最大人数;代码:#include<bits/stdc++.h>using namespace std;const int maxn = 505;const int INF = 1 << 30;struct edge {...原创 2020-01-14 17:40:33 · 452 阅读 · 0 评论 -
团体程序设计天梯赛 L2-031 深入虎穴 (25分)(bfs)
题目链接:L2-031 深入虎穴 (25分)思路:bfs一下即可代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1e5 + 5;int n, par[maxn];vector<int> son[maxn];void bfs(int u){ int now; q...原创 2020-01-14 15:58:22 · 533 阅读 · 0 评论 -
PAT顶级 1021 Safe Fruit (35分)(Bron-Kerbosch求最大团)
欢迎大家访问我的PAT TOP解题目录~https://blog.csdn.net/qq_45228537/article/details/103671868题目链接:1021 Safe Fruit (35分)思路:首先跟这位巨巨学了最大团Bron-Kerbosch算法:https://www.cnblogs.com/yefeng1627/archive/2013/03/31...原创 2020-01-09 19:45:32 · 2257 阅读 · 0 评论 -
PAT顶级 1014 Circles of Friends (35分)(并查集+BFS)
欢迎大家访问我的PAT TOP解题目录~https://blog.csdn.net/qq_45228537/article/details/103671868题目链接:1014 Circles of Friends (35分)思路:首先使用并查集就能很快求出集合个数;然后再对每个点BFS即可,虽然O(n2)O(n^2)O(n2),但是毕竟n不大;代码:#include...原创 2020-01-07 14:08:51 · 279 阅读 · 0 评论 -
PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
题目链接:1008 Airline Routes (35分)思路:将有向图分为若干强连通分量的裸题使用正反dfs的Kosaraju算法或者效率高一些、一次dfs的Tarjan算法即可;代码:#include<bits/stdc++.h>using namespace std;const int maxn = 12345;int dfn, scc_cnt, ...原创 2020-01-06 22:29:23 · 383 阅读 · 0 评论 -
Codeforces 1283F DIY Garland
题目链接:Codeforces 1283F DIY Garland思路:用一个数组保存所有结点度数,从后往前扫题目给的数组,[loop][根据贪心思想,每次匹配当前结点和度数为1的结点里序号最小的那个形成一条边,由于是从后往前扫,则我们是从叶子往根部推,因此匹配完这次后可以剪掉这条边不在考虑,算法上的体现就是两者度数都减一]代码:#include<bits/stdc++.h...原创 2019-12-31 17:01:59 · 359 阅读 · 1 评论 -
PAT顶级 1024 Currency Exchange Centers (35分)(最小生成树)
题目链接:1024 Currency Exchange Centers思路:1.该题求最小的cost使得所有货币可以互相转换,即最小生成树问题;2.我们使用kruskal算法来求,因为它可以方便的判定最小生成树的多样性;kruskal按照边权对边进行排序后,依次加入这些边,由于我们需要center最少,我们在边权相同的边中,优先遍历已经使用的center即可;代码:#inclu...原创 2019-12-25 22:51:17 · 251 阅读 · 3 评论 -
Codeforces 1277E Two Fairs(dfs)
题目链接:1277E Two Fairs思路:1.题意为a到b必须经过x和y,有多少对{a,b};2.我们将这个问题拆解开来:(1)有多少x想要到达b,必须经过a?由于是无向图,我们可以将这个问题转换为,b可以到达的点中,多少个点必须经过a?两次dfs即可;(2)a能到达的点中,多少必须经过b?两次dfs即可;根据计数的知识,我们可以知道答案即为上述两个问题答案的乘积;...原创 2019-12-21 18:24:40 · 314 阅读 · 0 评论 -
PAT顶级 1003 Universal Travel Sites (35分)(最大流)
思路:题目问stationstationstation的最小容量,变相就是问最多能一次性出发多少人,使得过程中不会超过每条边的容量,即最大流问题,用Ford−FulkersonFord-FulkersonFord−Fulkerson算法可很快的解决;代码:#pragma GCC optimize(2)#include<bits/stdc++.h>using namespa...原创 2019-12-18 20:35:04 · 1579 阅读 · 0 评论 -
PAT顶级 1016 Uniqueness of MST (35分)(最小生成树唯一性判断)
思路:1.用并查集实现kruskalkruskalkruskal算法,最后查询一共有几个集合即可完成判断图是否联通以及计算不连通状况下有几块连通分量的工作;2.根据kruskalkruskalkruskal算法的贪心思想,我们每次考虑未使用过的边里权值最小的那一条边,如果这条边两边的端点不属于同一集合,就合并它们。那这种思想里什么时候会出现不唯一性呢?即你当前遍历的这条边可以联通两个集合,我...原创 2019-12-17 15:24:52 · 1478 阅读 · 1 评论 -
PAT顶级 1001 Battle Over Cities - Hard Version (35分)(最小生成树)
思路:1.题意即求抹去哪个(些)点,剩下的点组成的最小生成树权值最小;2.两点间没有公路权值设为无穷,公路未被破坏权值设为0(方便计算最小生成树权值);3.需要注意一个城市被攻占后,剩余城市无法形成连通图的情况;(这时候代价设为无穷就行)代码:/* 多希望和明理在一起的是贵树君你啊 可惜在每秒下落五厘米的樱花中,你们错过了彼此 */#pragma GCC optimize(2...原创 2019-12-17 14:09:45 · 450 阅读 · 0 评论 -
Codeforces 1272E Nearest Opposite Parity(BFS)
思路:1.如果从i可到j,我们反过来存储,即j到i有一条单向边,存储所有的结点可以形成一张图;2.我们用队列进行bfs,初始将所有点都加入;3.对于每个点我们维护两个信息,离它最近的奇数多远&\&&离它最近的偶数多远;4.每次遍历队首的那个结点可达到的(注意已经反向存储)点,查看这些点是否需要更新信息,如果需要更新,更新完之后需要重新将该点加入队列;代码:#...原创 2019-12-13 17:34:54 · 462 阅读 · 0 评论 -
CCF CSP 201703-4 地铁修建(Dijkstra)
思路:题意即求结点1到结点n的所有路径中,边权的最大值最小的那条路径的边权最大值,稍微改用一下Dijkstra即可;代码:#include<bits/stdc++.h>using namespace std;const int MAX_V=1e5+99;const int INF=1<<30;struct edge{int to,cost;};typed...原创 2019-12-11 15:23:03 · 343 阅读 · 0 评论 -
Codeforces 1255B Fridge Lockers
思路:1.如果想不被其他人解开,那最优的办法就是连成环2.多出来的次数就重复连开销最小的两个点代码:#define IOS ios::sync_with_stdio(false)#include<bits/stdc++.h>using namespace std;typedef pair<int,int> P;typedef long long LL;...原创 2019-11-22 11:59:55 · 289 阅读 · 0 评论 -
Codeforces 1245D Shichikuji and Power Grid
思路:这题一共有两种思路:1.设立一个虚点,将所有点和它连接,cost是ci,然后其它点两两相连,cost为两点之间建立连接所需价格,然后求这个图的最小生成树,求出来的树中,和虚点相连的点就是自己设发电站的点,两个顶点都不是虚点的边就是需要修路的边;(在求解过程中需要使用long long)2.由贪心思想可以得知,所有ci中最小的那个i点一定要设立发电站,此时我们遍历所有j>=1&a...原创 2019-11-21 15:40:33 · 178 阅读 · 0 评论 -
1123 Is It a Complete AVL Tree (30 分)
这题的旋转过程参考的柳婼学姐的,链接:https://blog.csdn.net/liuchuo/article/details/53561924思路:发现左右高度不平衡的点会遇到四种情况:1.左子树的左边插入了结点;2.左子树的右边插入了结点;3.右子树的左边插入了结点;4.右子树的右边插入了结点;解决办法分别是:1.以此结点右旋;2.以此结点的左结点左旋,再以此结点右旋;3...原创 2019-09-02 12:05:33 · 207 阅读 · 0 评论 -
PAT 甲级 1119 Pre- and Post-order Traversals (30 分)
思路:1.用两个vector存储前根和后根遍历序列,同时用map存储每一个value在后根遍历序列中的位置;2.前序和后序不能确定唯一一颗二叉树的原因是,如果当前结点只有一个孩子,它不能分清这是左孩子还是右孩子;3.每次递归,前序的第一个和后序的最后一个就是当前结点,前序的第二个结点是当前结点的孩子结点,查询前序第二个结点在后序中的位置,若在倒数第二个位置,那当前结点只有一个孩子,设置标志“...原创 2019-09-03 17:02:24 · 105 阅读 · 0 评论 -
PAT 甲级 1115 Counting Nodes in a BST (30 分)
思路:1.用指针建树,因为树中有重复元素,所以不可以用映射;2.建树时记录每个结点的level,在new node()时,相应的mp[level]加一;3.用逆序的map,最后输出第一个元素和第二个元素和它们的和就好了;代码:#include<iostream>#include<map>using namespace std;struct node{ in...原创 2019-09-05 16:49:43 · 159 阅读 · 0 评论 -
PAT 甲级 1110 Complete Binary Tree (25 分)
思路:1.首先设定root等于1+2+…+n,即(n-1)*n/2,然后每输入一个孩子,如果它不是空的,就减去相应值,最后就会得到根节点;2.用vector<int,pair<int,int>>存储每个结点的状态,孩子为空设值为-1;3.利用队列层次遍历二叉树,同时在循环外用值记录当前遍历到的结点,因为最后可能会输出最后遍历到的结点;4.如果遍历到孩子为空的情况,接...原创 2019-09-05 20:48:11 · 93 阅读 · 0 评论 -
PAT 甲级 1111 Online Map (30 分)
思路:1.两次dijskra即可,用dfs会超时,我剪枝剪了好久还是会超时…2.每次判断是否最短(最快)的时候依据题目中的两个标准;3.用vector保存每个点可达的下一个点,用邻接矩阵存储距离和时间,用数组标记每个点是否已知最短(最快),用数组记录每个点此刻离起点的距离、最短路径的最短可达时间、最短时间、最短时间的最少周转次数,再用数组保存每个点的最短路径前驱结点和最短时间前驱结点;4....原创 2019-09-07 11:19:03 · 399 阅读 · 0 评论 -
CCF CSP 201709-4 通信网络
思路:1.正着存一个图,再把边的方向倒过来再存一个图;2.对于每个点,dfs正着的那个图,再dfs倒着的那个图,分别设立两个数组标记每个点是否被访问,如果有点两次都没有被访问,则该点不能知道所有点;3.刚开始想错了,想着正着要遍历到所有点或者倒着要遍历到所有点才行,这样才30分,而且觉得自己很对,30分的朋友可以康康是不是这个错QAQ;代码:#define IOS ios::sync...原创 2019-11-15 16:59:26 · 358 阅读 · 0 评论 -
CCF CSP 201812-4 数据中心
思路:这题直接抄并查集和Kruskal模板就行;(做题前:为什么要用板子,我可以自己写。做题后:板子真香啊。)代码:#define IOS ios::sync_with_stdio(false);cin.tie(0)#include<bits/stdc++.h>using namespace std;const int MAX_N=50005;const int M...原创 2019-11-14 17:44:27 · 177 阅读 · 0 评论 -
CCF CSP 201312-5 I’m stuck!
试题编号: 201312-5 试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此方格; '+': 当玩家到达这一方格后,...原创 2019-10-11 20:12:22 · 267 阅读 · 0 评论 -
CCF CSP 201409-4 最优配餐
思路:1.学会将多源在一开始时全部加入队列,然后bfs求最优的做法;2.用一个二维数组表示目前该点离店最近的距离,所有距离初始化为1000*1000以上的值;3.将所有订单,以坐标和量按序存储起来,之后直接挨个累加就好了;4.总开销可能会超过int范围,所以可以使用long long;代码:#include<bits/stdc++.h>using namespace st...原创 2019-10-28 12:01:52 · 453 阅读 · 0 评论 -
CCF CSP 201712-4 行车路线
思路:这题有两种思路:Dijkstra和SPFA,都可以100分;在求最短路径时,Dijkstra往往是效率比较高的解法,但是本题使用Dijkstra的变形并不能完全贴合题意,因为这种贪心算法遇到“局部最优≠整体最优”的情况就失效了,但是不妨拿来练练手hh;Dijkstra:大体框架还是照搬Dijkstra,但是注意使用long long,唯一变形的就是另设一个数组clen[],用来表示第i...原创 2019-11-11 19:33:51 · 438 阅读 · 0 评论