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;
}

信息竞赛进阶指南--搜索相关(模板)相关推荐

  1. 信息竞赛进阶指南--单调队列模板

    // 单调队列 int l = 1, r = 1; q[1] = 0; // save choice j=0 for(int i = 1; i <= n; i++) {while (l < ...

  2. 『ACM-算法-Hash算法』信息竞赛进阶指南--字符串哈希

    字符串hash主要应用在: 寻找长度为n的主串S中的匹配串T(长度为m)出现的位置或次数的问题属于字符串匹配问题. 类似的还有KMP,我也有讲解. 原理: 将字符串中的每一个字母都看做是一个数字(例: ...

  3. 『ACM-算法-数据结构』信息竞赛进阶指南--树状数组 (模板)

    写在前面: 我们是主要是讲算法模板,即实现的代码,并不讲实现的原理 什么是树状数组? 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度 ...

  4. 『ACM--算法--KMP』信息竞赛进阶指南--KMP算法(模板)

    简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用匹 ...

  5. 信息竞赛进阶指南--二叉堆(模板)

    啥是二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆:父结点的键值 ...

  6. 信息竞赛进阶指南--递归法求中缀表达式的值,O(n^2)(模板)

    // 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) {// 寻找未被任何括号包含的最后一个加减号for (int i = r, j = 0; i >= l; ...

  7. 信息竞赛进阶指南--中缀表达式转后缀表达式并求值(模板)

    // 后缀表达式转中缀表达式,同时求值,O(n)// 数值栈 vector<int> nums; // 运算符栈 vector<char> ops;// 优先级 int gra ...

  8. 信息竞赛进阶指南--单调栈(模板)

    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; ...

  9. 『ACM-数据结构』信息竞赛进阶指南--线段树

    我们主要是讲代码实现,不是讲基本原理! 什么是线段树? 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点 ...

最新文章

  1. ITK:高斯的一阶导数进行卷积来计算图像的梯度
  2. 关于毕业租房的一些碎碎念。
  3. 九阴真经 第十五层--node.js 第2天
  4. UVA 725 Division(除法)
  5. 前端学习(2016)vue之电商管理系统电商系统vue-quill-editor
  6. 论文浅尝 - ICLR2020 | 知道什么、如何以及为什么:基于方面的情感分析的近乎完整的解决方案...
  7. fatal: protocol error: bad line length character: No s原因
  8. 【java】java AQS AbstractQueuedSynchronizer 实现自定义锁以及相关简介
  9. asp.net中使用水晶报表 ---pull
  10. SM3算法 (python)
  11. 怎样才能走进区块链行业?
  12. ubuntu14 teamviewer使用
  13. ORA-00821: Specified value of sga_target 980M is too small, needs to be at least 1164M
  14. ROsalind 014 Finding a Shared Motif
  15. 装了linux无法进入bios设置u盘启动,装了linux无法进入bios设置密码
  16. SSL/TLS工作原理
  17. WinDebug dump
  18. 【鉴黄师赞美】工夫.av:看到最后我默默地穿上了裤子
  19. ARM汇编程序入门实践
  20. 考前临时抱佛脚(DFS)

热门文章

  1. Win10(UEFI启动)安装Ubuntu18.04双系统
  2. web.xml详细介绍
  3. APPium-Xpath,swipe练习
  4. Spring_Bean的作用域---和使用外部属性文件
  5. Gstreamer编程
  6. 写文件头的算法流程及C代码实现
  7. html alert 的三种方式
  8. nginx下面server配置
  9. JS读取JSON数据
  10. WPF and Silverlight 学习笔记(六):WPF窗体