图论
CCCCDEV_CCCC
志在四方少年,羡慕南飞的雁
展开
-
1144 最短路计算(bfs打spfa)
同样,将这个节点的答案+=他父节点的答案,但不需要(push)因为已经访问不需要再进行更新了。多源最短路,比如说dijkstra是单源中的最短路径。如果是第二次访问且当前的距离等于之前记录的距离。将这个节点的答案赋值为加上他父节点的答案。因为我们会发现一个漏洞,就是无向无权。当访问到这个节点时,如果是第一次访问。并将这个节点推到队尾(push)搜索,就是一个普通的路。说明这是第二条最短路。...原创 2022-08-02 16:10:34 · 92 阅读 · 0 评论 -
1058 立体图
题意定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放。意思就是说,这个积木的样子就是一个打表格,所以这个就是我们最基础上的东西。这个题,这么变态,我居然AC过,而且还没有博客,我自己他妈都不都不信。把图形存到数组里面(也就是所谓的打表),然后进行一个一个的覆盖。不是这个题这么变态我怎么可能做过。......原创 2022-07-17 20:35:52 · 74 阅读 · 0 评论 -
2196 挖地雷
2196 挖地雷原创 2022-07-13 00:52:27 · 58 阅读 · 0 评论 -
3916 图的遍历
3916 图的遍历原创 2022-07-12 21:26:36 · 82 阅读 · 0 评论 -
3385 负环
3385 负环原创 2022-07-11 17:57:37 · 130 阅读 · 0 评论 -
5683 道路拆除
5683 道路拆除这个题也就是最短路径呗,挺好的,我猜猜,首先求一下最短路径然后把不是最短路径的边全部删去很显然我猜错了由起点开始到两个终点,很容易理解是最短路接着想,直接最短路是行不通的,因为我们要求经过的次数,直接最短路过重复那么怎么样子做到不重复?于是就要跑三遍最短路#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<queue原创 2021-10-02 12:20:24 · 87 阅读 · 0 评论 -
1525 关押罪犯
1525 关押罪犯所谓二分图,便是如此,用两个集合进行表示的集合,便是二分图这个题便是让我们进行分配这个图,划分成两个集合,使得一个固定关系最小当然这个题还有点类似于动态规划(只是说性质),不能用贪心,比如我们将最小的连边,那么是不一定可行的,因为假设总共有abcd四个点,虽然链接了ab两个的怨气值是最小的,说不定cd的就会特别的大,那么不可以这样安排#include<bits/stdc++.h>using namespace std;const int maxn=100000+1原创 2021-08-22 14:42:14 · 59 阅读 · 0 评论 -
1894 完美的牛栏
1894 完美的牛栏当然这是一个模板题,没什么好解释的,二分图的代码非常的短#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>const int N=201;int n,m,lk[N],g[N][N],v[N],ans;bool dfs(int now){ for(int i=1;i<=n;i++)原创 2021-08-22 14:41:10 · 90 阅读 · 0 评论 -
1330 封锁阳光大学
1330 封锁阳光大学封锁尽量多的路,并且不发生冲突,很明显是个二分图和关押罪犯有点像首先,我们要明白,这个图不一定联通,那么我们就能将这个图,切开成多个子图进行处理,那么如果是一个连通图,怎么切割?!不要慌张,先理解,每一条边都有且仅有一个被它所连接的点被选中所以相邻的点连成不同的颜色#include<cstdio>#include<iostream>#include<cmath>#include<string>#include<s原创 2021-08-22 14:41:17 · 80 阅读 · 0 评论 -
1260 工程规划
1260 工程规划萌新刚刚学会差分约束,很多大佬的解释我都不会大家都知道,差分约束有m个不等式,要找到一组解,满足所有的约束,因为不等式都是差分形态,所以要满足所有约束,所以叫做差分约束我们采取这样的方式建边:对于ai-aj<=b,从j向i连一条边权为b的边SPFA判断负环已经有说明,不再说了#include<cstdio>#include<algorithm>#include<iostream>#include<queue>#incl原创 2021-08-22 14:42:07 · 67 阅读 · 0 评论 -
1250 种树
1250 种树SPFA的数据范围只适用于103~4左右,因为他实在是太垃圾了这个题是差分约束的板子题,不过好像贪心也可以做,但是我太懒了,不想再打一遍贪心了只不过我们建立不等式边后,跑一边最短路,再取最小的距离,用n的距离减去最小的长度#include<iostream>#include<cstdio>#include<algorithm> #include<string>#include<cstring>#include<原创 2021-08-22 14:42:03 · 75 阅读 · 0 评论 -
1993 小k的农场
1993 小k的农场差分约束的题一般都是用SPFA进行解决输入多种不同的路径,差分路径,权值路劲,双向路径然后判断是否满足最短路性质#include<iostream>#include<algorithm>#include<string>#include<cstring>#include<cstdio>#include<queue> using namespace std;const int SIZE=5005;原创 2021-08-21 17:00:00 · 37 阅读 · 0 评论 -
1510 出纳员问题
1510 出纳员问题差分约束这个知识点非常锻炼你的代码能力和数学能力首先设num[i] 为来应聘的在第i个小时开始工作的人数r[i] 为第i个小时至少需要的人数x[i] 为招到的在第i个小时开始工作的人数0 <= x[i] <= num[i]x[i] + x[i-1] + …+ x[i-7] >= r[i] (题目中的连续工作8小时)再设 s[i] = x[1] + … + x[i]则有: s[i] – s[i-1] >= 0s[i-1] – s[i] >=原创 2021-08-21 16:05:49 · 329 阅读 · 0 评论 -
1509 Intervals
1509 Intervals很明显这是一个差分约束的题目求满足多个不等式的条件的东西,可以把不等式转换成图论中最短路问题然后进行松弛这是一个很标准的差分约束系统问题要求的不等式条件是:s[b[i]]-s[a[i]-1]≥c[i],其中s数组表示当前位置为止选择的个数然后转换一下s[b[i]] ≥ s[a[i]-1]+c[i]s[i] ≥ s[i-1]+0s[i-1] ≥ s[i]+(-1)#include<iostream>#include<cstring>#原创 2021-08-21 15:51:13 · 217 阅读 · 0 评论 -
1512 排队布局
1512 排队布局通过给定的距离为不等关系,这道题肯定是一个差分约束差分约束,通过差分约束,存储图,然后模板SPFA#include<cstdio>#include<queue>#include<algorithm>using namespace std;#define MAXM 10010#define MAXN 1005#define INF 100000000000000#define LL long longstruct node{原创 2021-08-21 15:20:25 · 248 阅读 · 0 评论 -
5960 差分约束系统
差分约束系统这个知识点,一直都不会,但是听说过,直到练习完最短路,就顺带学习一下,原来就是给定一些形如x-y<=b的不等式的约束,问是否有解这个问题和图论有什么关系?不过这个这个知识点还真能转换成图论中的最短路问题比如我们给出三个不等式,b-a<=k1,c-b<=k2,c-a<=k3c,求出c-a的最大值,我们来把这a,b,c转换成三个点,然后,k1,k2,k3表示权值如图:由题目我们可以知道,在这个图中,b-a<=k1,c-b<=k2,得出c-a<=原创 2021-08-21 14:37:52 · 70 阅读 · 0 评论 -
1504 Word Rings
1504 Word Rings将一个字符串看成一条边,字符两端的字符看成节点,长度看成权值,然后用二分枚举答案即可不过感觉这个题这么像KMP或者hash用SPFA,因为这个题目的专栏是SPFA的优化#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#include<stack>#include<cstdio>#include<原创 2021-08-21 14:06:38 · 270 阅读 · 0 评论 -
1608 路径统计
1608 路径统计为什么标签上写着概率,不是吧阿Sire这个题目是什么意思?先来提炼一下题目道路是单向的,所以这是一个有向图,求一个最少花费的路径有多少条,也就是需要特别记录更新最短路径的条数的时候,我们需要使用一个cnt数组记录这个点的最短路径条数,也就是额外处理1.如果搜索到的点到起点的距离等于当前点到起点的距离加上这两点间的那条边的距离,那么我们就将搜索到的点的路径数加上当前点的路径数这个操作很经典也即是if(dis[i]==dis[k]+e[k][i]) cnt[i]+=cnt[原创 2021-08-21 13:47:04 · 109 阅读 · 0 评论 -
1499 最短路计数
1499 最短路计数由题面可是用来统计最短路的个数对于最短路径算法常用的就是dijkstra和SPFA,但是总所周知,SPFA有的时候会很废物我用两种做法,一个是SPFA,一个是dijkstra+堆优化SPFA关于SPFA,他死了不过在这道题里还是可以抢救他一下的#include<iostream>#include<vector>#include<queue>using namespace std;const int maxn=0x7fffffff;原创 2021-08-21 13:11:54 · 305 阅读 · 0 评论 -
1496 架设电话线
1496 架设电话线这里涉及到一个知识点叫做 分层求最短路径好像是个很牛的东西一句话:在加权无向图上求出一条从 1 号结点到 N 号结点的路径,使路径上第 K+1 大的边权尽量小嗯。。。我日常的没有任何思路,难不成是一个贪心?使用分层计算,用二维组表示坐标,然后进行每一层求最短路径,分层的时候一定要从低到高开始分层求最短路类似于递归分层#include<iostream>#include<cstdio>#include<algorithm>#incl原创 2021-08-21 12:31:49 · 330 阅读 · 0 评论 -
1495 孤岛营救问题
1495 孤岛营救问题这个题是一个历史题加阅读理解题数学是火,点亮物理的灯。物理是灯,照亮化学的路。化学是路,通向生物的坑。生物是坑,埋葬了理科生,很明显是一个最短路径的问题,好模板,要是开始也能遇见这么模板的题就好了然后就是这个题可以用两种做法,一个是最短路版本,一个广度优先搜索版本广搜广搜,这个版做法其实就是把每个状态的钥匙进行分层,然后根据状态进行搜索最短路径#include<bits/stdc++.h>using namespace std;const int N原创 2021-08-21 11:29:57 · 581 阅读 · 0 评论 -
1494 Sightseeing Trip
1494 Sightseeing Trip练习最短路径的菜鸡求图中至少包含3个点的环,所以这个题是用来求环的,环上的节点不重复#include<iostream>#include<algorithm>#include<cstring>#define MAX 0x3f3f3f3f#define ll long longusing namespace std;int path[310][310],dis[310][310],points[310][310];原创 2021-08-20 21:14:39 · 177 阅读 · 0 评论 -
1119 灾后重建
1119 灾后重建这个题是一个比较水的蓝题,是2020夏令营时老师出的,当时不会,现在来水这个题貌似要用最短路径进行解决只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄,这里的时间就是路径的权值,也就是最短路径模拟就好,如果用最小生成树就时建立一条t边的树就好吧#include<bits/stdc++.h>#define inf 0x3f3f3f3fusing namespace std;int tu[205][205],cj[205],n,m;int main原创 2021-08-20 20:13:47 · 59 阅读 · 0 评论 -
1195 口袋的天空
1195 口袋的天空因为之前做过的生成树的黄题太水,不想整理了所以我还是来练习生成树的绿题,当然这是个黄题,不要在意不要在意好了,很简单,一个模板题,只不过生成树用k条边,题目中已经很明确了#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define N 1005using namespace std;i原创 2021-08-20 19:43:32 · 55 阅读 · 0 评论 -
1546 最短网络
1546 最短网络凡是能用邻接矩阵解决的图论题就是水题by 警察浩翔你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案最小生成树的模板题选择节点加入最小生成树,重复n-1次,表示建立n-1条边#include<iostream>#include<cstdio>#include<algorithm> using namespace std;struct node{ int x,y,w;//起点终点,权值}a[200原创 2021-08-20 19:29:57 · 48 阅读 · 0 评论 -
1493 次小生成树
1493 次小生成树练完一本通的题目后把洛谷的生成树的题目再整理一下,之前做过的生成树的洛谷题,把部分都是纯模板,没有什么想写的吧这个题就是模板的次小生成树,这个知识点来自一次省队选拔虽然如此,但是大纲里有准确来说,次小生成树又叫做严格次小生成树次小生成树的定义为:边权和严格大于最小生成树的边权和最小的生成树也就是边权和第二小的生成树次小生成树,是个菜鸡都知道,和最小生成树肯定有关系所以,我们的思路就是,枚举每一条没有加入最小生成树的边,加入最小生成树,同时在最小生成树中删除边权最大的当然原创 2021-08-20 19:12:37 · 354 阅读 · 0 评论 -
1489 构造完全图
1489 构造完全图光看这个名字就觉得不是什么善茬这个名字难道和生成树有关系?若一个图的每一对不同的顶点都有一条边相连,那么就是一个完全图这就是一个给定生成树,进行还原这个完全图比较复杂最小生成树T,T的每一条边都是一条割边,...原创 2021-08-20 17:41:24 · 529 阅读 · 0 评论 -
1488 新的开始
1488 新的开始新的开始…保证最少的花费,那么很明显这就是一个最小生成树了做题之前盲猜一下,这个题应该要跑两遍最小生成树,因为他说了使用两种情况,p和v——在井上修建一个和在各个井中间修建一个;所以跑两遍之后进行比较出最小的答案?我似乎猜对了补充:C++的小技巧,将cin变成scanf这么快,不过我不想记ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);好了,接着来分析本题和刚才那个题类似,都是维护两个距离,那么直接进行分类讨论就好原创 2021-08-20 13:22:41 · 203 阅读 · 0 评论 -
1487 北极通讯网络
1487 北极通讯网络这个题就是用来维护一个最短路径吧也不难,就是用来求最小生成树的第k条边并且,这貌似和并查集还有一定的关系我太傻了,这里生成树的方法就是krusal,我居然想:怎么还用并查集?太菜了太菜了好了,这个题的操作其实很简单#include<bits/stdc++.h>using namespace std;const int maxn = 1e6+10;int pre[505];vector<double>v;struct dot{ int s原创 2021-08-20 12:53:10 · 191 阅读 · 0 评论 -
1486 黑暗城堡
1486 黑暗城堡我是练习最小生成树的菜鸡我发现图论的题都非常好理解,一看就知道是图论的题这个题貌似和排列组合还有关系?看了两遍没看懂是什么意思这个题是最短路径生成树,也就是最短路径和生成树的结合对于任意一对父子结点x、y均满足dis[y]=dis[x]+e[x][y]的树结构称为图的一棵最短路径生成树,也就是一个具有最短路径图的性质的生成树对于一些图的基本操作,我快忘了,但是有多么的熟悉预处理时,需要双向存储正无穷,而我们在多条路径中,需要保存最小的那一个,只需要在输入的时候保存一下就行了原创 2021-08-20 12:01:09 · 287 阅读 · 0 评论 -
拓扑排序
拓扑排序给定一个有向无环图,如果由图中所有构成序列A满足对于途中每一条边(x,y)x在y之前就出现过,那么A就是一个拓扑排序他的思想非常的简单,只需要不断选择图中入读为0的节点x,然后把x链接的点的入入读减1,我们可以结合BFS来解决这个问题1.建立空的序列A2.预处理所有节点的入度deg[i],然后把所有入度为0的节点入队3.取出对头节点x,把x加入拓扑序列的末尾4.把x的连边(x,y)将deg[y]减一,如果出现新的入度为0的节点,就将y入队5.重复3 4直至队列为空拓扑排序也可以判断有原创 2021-05-04 15:15:40 · 83 阅读 · 0 评论 -
欧拉问题
欧拉问题欧拉路径,如果一个图存在一个笔画,那么笔画的路径叫做欧拉路径,欧拉回路,如果最后又可以回到起点,就叫欧拉回路奇点是指一个点的相连的边的数目为奇数个的点,那么对于欧拉路径欧拉回路,肯定存在如下的定理:1.欧拉路径,图必须连通,有且只有2个奇点2.欧拉回路,图必须联通,有0个奇点那么如何去求解一个欧拉问题呢?这里算法分两种:Fleury这个算法解决欧拉回路的具体输出路径,是一种依靠删边的方法求解算法每次从栈中获取这个点,判断它是否孤立,也就是是否还有连边,如果是一个孤立的点就输出说明是原创 2021-05-22 17:30:17 · 10042 阅读 · 1 评论 -
二分图
二分图二分图,又叫做偶图其概念及定理过于复杂,之前早就研究过如果一张无向图的n个节点可以分成A,B两个非空集合,其中AB不相交,并且在同一集合内的点之间没有边相连,那么这张无向图为一个二分图,A,B分别是二分图的左部右部二分图的判定判定,就是说判断这个图是不是二分图我们看一个定理一个二分图不存在奇环(长度为奇数的环)那么就可以使用染色法来判定,其思想大致为:尝试用黑白两种颜色标记标记图中的节点,当一个节点被标记后,他的相邻的节点应该被标记为相反的颜色,若过程中发生冲突了,说明存在奇环,如果原创 2021-05-22 19:42:16 · 128 阅读 · 0 评论 -
最短路径
最短路径算法单源最短路径算法简称SSSP,是说给定一张有向图,从1号顶点出发,求出长度为n的d数组,其中d数组表示从1到i的最短路径的长度对于无向图,我们通常把无向边看成两条相反的有向边,也就是在存储的时候存两次单源,就是说以一个固定的点为起点的最短路径dijkstra算法 O(N2)dijkstra算法的流程如下:1.初始化最短路径数组d[1]=0表示自己到自己的长度为0,其他的点设置为正无穷2.找出来一个没有被标记的、d[x]最小的节点x,然后标记x3.扫描x的所有链边(x,y,z)如果原创 2021-05-18 22:33:51 · 663 阅读 · 0 评论 -
生成树
生成树生成树,好长时间没有学习,居然快忘了什么是生成树了给定一张边带权的无向图G,由n个顶点和n-1条边构成的无向联通子图叫做一个生成树,边的权值之和最小的生成树叫做最小生成树...原创 2021-05-19 22:29:16 · 160 阅读 · 0 评论 -
图论
图论这篇文章,我不写算法,只记录一些图的相关概念无向图无向图就是指一条双向的边,起点终点u,v可以u->v v->u两个之间互相到达有向图有向图就是指边有方向,只能按照箭头方向行走带权图边上含权,又叫做网,权值是指的一种关系,而不是具体的长度,比如一个图,可以有三条边abc,a可以为1,b可以为1,c也可以为10000,不是什么三角形,而是一种两两到达的关系入度度,就是指相关联的边的数目,有奇点偶点之分,奇点的度为奇数,偶点的度为偶数入度,就是以这个点为终点的边的个数,也就是原创 2021-05-20 16:17:35 · 272 阅读 · 0 评论