图论
Deft1592
这个作者很懒,什么都没留下…
展开
-
最小生成树
贪心策略,随便找一个点一般为1,每次找到与其最近的点加入树,同时对加入的点记忆化,之后更新每个最近的值并用pre记录前驱,(可以打印边与路径);变形:对于下面这种对个点可以做中心(如建立发电站)求最小生成树的,找到0点作为超级点,到每个中心的w即建立发电站的费用,将0点加入,求最小生成树即可。原题:ACWING,3728#include<cstdio>#include<cstring>#include<algorithm>#include<iostre原创 2021-09-05 20:24:34 · 71 阅读 · 0 评论 -
二叉搜索树(一些函数)
本文只列出一些二叉搜索树的基本函数,效率取决于树的深度,如果小于父节点往左排,大于父节点往右排这种数据结构本身很少使用,因为它的各种操作复杂度是O(h),其中 h为层数。只有在它大致平衡(平衡指所有叶子的深度趋于相同),才具有优秀的复杂度(当它是完全二叉树时,为 [公式] ),然而这只是理想情况。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#includ原创 2021-08-18 12:05:09 · 98 阅读 · 0 评论 -
莫队算法初步
莫队算法是用于解决l,r转化为l,r+1;l.r-1;l-1,r;l+1,r这类问题而设计的算法下面看到例题:Given a sequence of n numbers a1, a2, …, an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the s原创 2021-08-17 11:18:14 · 56 阅读 · 0 评论 -
分块(块状数组)
洛谷P2801 教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给 XMYZ 信息组每个英雄看。于是 NN 个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为 1, 2, \ldots, N1,2,…,N。每个人的身高一开始都是不超过 10001000 的正整数。教主的魔法每次可以把闭区间 [L, R][L,R](1≤L≤R≤N1≤L≤R≤N)内的英雄的身高全部加上一个整数 WW。(虽然 L=RL=R 时并不符合区间的书写规范,但我们可以认为是单独增加第 L®L® 个原创 2021-08-16 15:47:10 · 128 阅读 · 0 评论 -
线段树模板
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<set>#include<string.h>#include<vector>#include<set>#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);#define.原创 2021-08-15 18:16:43 · 71 阅读 · 0 评论 -
传递闭包(简单)
传递闭包算法是用来解决图论上一个点是否能到达另一个点的算法,那么我们把Floyd算法稍微改下就可得到:for (int k = 1; k <= n; ++k) for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (E[i][k] && E[k][j]) E[i][j] = 1;POJ1975 Median Weight原创 2021-08-13 17:34:24 · 1063 阅读 · 0 评论 -
拓扑排序(简单的排序)
如果给你许多人的高低关系,让你为这些人按从高到低排个序,你会怎么做?我们会用拓扑排序来完成,把每个关系组成图用箭头表示,先把入度为0的点放到队列中,在根据队列把列内元素指向的元素入度减1,之后再寻找入度为0的元素放入队列,这样子得到的元素总数cnt如果与事先知道的元素总数n相等则说明无环出现,如果不等则说明这个问题有环且无解:ZCMU-2153#include<queue>#include<iostream>#include<cstdio>#include&l原创 2021-08-12 16:19:15 · 122 阅读 · 0 评论 -
最近公共祖先
#include<queue>#include<iostream>#include<cstdio>#include<string.h>#include<vector>#include<cstring>#include<cctype>#include<cmath>#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);#defin.原创 2021-08-10 23:09:47 · 69 阅读 · 0 评论 -
并查集的应用
并查集是一个树形结构常用来确认两个元素是否在一个集合中,通常有合并查询两大操作:这道题便是典型的并查集应用:#include <cstdio>#define MAXN 5005int fa[MAXN], rank[MAXN];inline void init(int n){ for (int i = 1; i <= n; ++i) { fa[i] = i; rank[i] = 1; }}int find(int x)原创 2021-08-10 13:41:59 · 67 阅读 · 0 评论 -
差分约束算法
我们把不等式转化为图论中dist[to]<>dist[p]+edges[e].w;这便是差分约束,那么源头点在哪呢,我们新建一个0点作为源头任何点到他的距离为0,求其余点到他的最短路或最长路距离就是不等式组的解集题目描述给出一组包含 m 个不等式,有 n 个未知数的形如:的不等式组,求任意一组满足这个不等式组的解。输入格式第一行为两个正整数 n,m,代表未知数的数量和不等式的数量。接下来 m 行,每行包含三个整数 [公式] ,代表一个不等式 [公式]。输出格式一行,n 个数,表原创 2021-08-09 15:38:11 · 109 阅读 · 0 评论 -
匈牙利算法
存图的三种方式:邻接矩阵inline void add(int u, int v, int w){ mat[u][v] = w; mat[v][u] = w;}邻接表std::vector<Edge> edges[MAXN];inline void add(int from, int to, int w){ Edge e = {to, w}; edges[from].push_back(e); //向vector的最后添加一条..原创 2021-08-07 15:59:43 · 156 阅读 · 0 评论 -
最短路问题(总结)
多源最短路:FLOYD 算法:void Floyd(int n){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);}解决任意两个点的最短路径,时间O(n3),空间O(n2);一般很少会求多源最短路,因为复杂度很大,除非原创 2021-08-08 17:22:39 · 125 阅读 · 0 评论