信息竞赛进阶指南--搜索相关(模板)
ACM常用模板合集
// 深度优先遍历框架
void dfs(int x) {v[x] = 1;for (int i = head[x]; i; i = next[i]) {int y = ver[i];if (v[y]) continue;dfs(y);}
}// DFS序
void dfs(int x) {a[++m] = x;v[x] = 1;for (int i = head[x]; i; i = next[i]) {int y = ver[i];if (v[y]) continue;dfs(y);}a[++m] = x;
}// 求树中各点的深度
void dfs(int x) {v[x] = 1;for (int i = head[x]; i; i = next[i]) {int y = ver[i];if (v[y]) continue; // 点y已经被访问过了d[y] = d[x] + 1;dfs(y);}
}// 求树的重心
void dfs(int x) {v[x] = 1; size[x] = 1; // 子树x的大小int max_part = 0; // 删掉x后分成的最大子树的大小for (int i = head[x]; i; i = next[i]) {int y = ver[i];if (v[y]) continue; // 点y已经被访问过了dfs(y);size[x] += size[y];max_part = max(max_part, size[y]);}max_part = max(max_part, n - size[x]);if (max_part < ans) {ans = max_part;pos = x;}
}// 划分图的连通块
void dfs(int x) {v[x] = cnt;for (int i = head[x]; i; i = next[i]) {int y = ver[i];if (v[y]) continue;dfs(y);}
}
for (int i = 1; i <= n; i++)if (!v[i]) {cnt++;dfs(i);}// 广度优先遍历框架
void bfs() {memset(d, 0, sizeof(d));queue<int> q;q.push(1); d[1] = 1;while (q.size()) {int x = q.front(); q.pop();for (int i = head[x]; i; i = next[i]) {int y = ver[i];if (d[y]) continue;d[y] = d[x] + 1;q.push(y);}}
}// 拓扑排序
void add(int x, int y) { // 在邻接表中添加一条有向边ver[++tot] = y, next[tot] = head[x], head[x] = tot;deg[y]++;
}
void topsort() {queue<int> q;for (int i = 1; i <= n; i++)if (deg[i] == 0) q.push(i);while (q.size()) {int x = q.front(); q.pop();a[++cnt] = x;for (int i = head[x]; i; i = next[i]) {int y = ver[i];if (--deg[y] == 0) q.push(y);}}
}
int main() {cin >> n >> m; // 点数、边数for (int i = 1; i <= m; i++) {int x, y;scanf("%d%d", &x, &y);add(x, y);}topsort();for (int i = 1; i <= cnt; i++)printf("%d ", a[i]);cout << endl;
}
信息竞赛进阶指南--搜索相关(模板)相关推荐
- 信息竞赛进阶指南--单调队列模板
// 单调队列 int l = 1, r = 1; q[1] = 0; // save choice j=0 for(int i = 1; i <= n; i++) {while (l < ...
- 『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希
字符串hash主要应用在: 寻找长度为n的主串S中的匹配串T(长度为m)出现的位置或次数的问题属于字符串匹配问题. 类似的还有KMP,我也有讲解. 原理: 将字符串中的每一个字母都看做是一个数字(例: ...
- 『ACM-算法-数据结构』信息竞赛进阶指南--树状数组 (模板)
写在前面: 我们是主要是讲算法模板,即实现的代码,并不讲实现的原理 什么是树状数组? 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度 ...
- 『ACM--算法--KMP』信息竞赛进阶指南--KMP算法(模板)
简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用匹 ...
- 信息竞赛进阶指南--二叉堆(模板)
啥是二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆:父结点的键值 ...
- 信息竞赛进阶指南--递归法求中缀表达式的值,O(n^2)(模板)
// 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) {// 寻找未被任何括号包含的最后一个加减号for (int i = r, j = 0; i >= l; ...
- 信息竞赛进阶指南--中缀表达式转后缀表达式并求值(模板)
// 后缀表达式转中缀表达式,同时求值,O(n)// 数值栈 vector<int> nums; // 运算符栈 vector<char> ops;// 优先级 int gra ...
- 信息竞赛进阶指南--单调栈(模板)
a[n + 1] = p = 0; for (int i = 1; i <= n + 1; i++) {if (a[i] > s[p]) {s[++p] = a[i], w[p] = 1; ...
- 『ACM-数据结构』信息竞赛进阶指南--线段树
我们主要是讲代码实现,不是讲基本原理! 什么是线段树? 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点 ...
最新文章
- ITK:高斯的一阶导数进行卷积来计算图像的梯度
- 关于毕业租房的一些碎碎念。
- 九阴真经 第十五层--node.js 第2天
- UVA 725 Division(除法)
- 前端学习(2016)vue之电商管理系统电商系统vue-quill-editor
- 论文浅尝 - ICLR2020 | 知道什么、如何以及为什么:基于方面的情感分析的近乎完整的解决方案...
- fatal: protocol error: bad line length character: No s原因
- 【java】java AQS AbstractQueuedSynchronizer 实现自定义锁以及相关简介
- asp.net中使用水晶报表 ---pull
- SM3算法 (python)
- 怎样才能走进区块链行业?
- ubuntu14 teamviewer使用
- ORA-00821: Specified value of sga_target 980M is too small, needs to be at least 1164M
- ROsalind 014 Finding a Shared Motif
- 装了linux无法进入bios设置u盘启动,装了linux无法进入bios设置密码
- SSL/TLS工作原理
- WinDebug dump
- 【鉴黄师赞美】工夫.av:看到最后我默默地穿上了裤子
- ARM汇编程序入门实践
- 考前临时抱佛脚(DFS)