acwing算法提高之图论--拓扑排序

news/2024/5/9 7:31:23

目录

  • 1 介绍
  • 2 训练
  • 3 参考

1 介绍

本专题用来记录拓扑排序相关的题目。

求拓扑序列算法的关键步骤

  1. 把入度为0的结点插入队列q。
  2. 弹出队头t(将t记录下来),遍历队头t的下一个结点,将其入度减1。操作之后,如果其值为0,则插入队列q。
  3. 重复进行步骤2,直至队列q为空。
  4. 弹出的元素组成的序列就是一个拓扑序列。

有向无环图等价于图中存在拓扑序列

2 训练

题目1:1191家谱树

C++代码如下,

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;const int N = 110;
int n;
int din[N];
vector<vector<int>> g(N);int main() {cin >> n;for (int i = 1; i <= n; ++i) {int t;while (cin >> t, t) {g[i].emplace_back(t);din[t]++;}}queue<int> q;for (int i = 1; i <= n; ++i) {if (din[i] == 0) {q.push(i);}}vector<int> res;while (!q.empty()) { //队列中存储的是,目前所有入度为0的结点int a = q.front();q.pop();res.emplace_back(a);for (auto b : g[a]) {din[b]--;if (din[b] == 0) {q.push(b);}}}for (auto x : res) cout << x << " ";cout << endl;return 0;
}

题目2:1192奖金

C++代码如下,

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;const int N = 10010;
int n, m;
vector<vector<int>> g(N);
int dist[N];
int din[N];int main() {cin >> n >> m;for (int i = 0; i < m; ++i) {int a, b;cin >> a >> b;g[b].emplace_back(a);din[a]++;}memset(dist, 0x3f, sizeof dist);queue<int> q;for (int i = 1; i <= n; ++i) {if (din[i] == 0) {q.push(i);dist[i] = 100;}}int cnt = 0;//入度为0的结点总数while (!q.empty()) {int a = q.front();q.pop();cnt++;for (int b : g[a]) {din[b]--;if (din[b] == 0) {q.push(b);dist[b] = dist[a] + 1;}}}if (cnt != n) puts("Poor Xed");else {int sum = 0;for (int i = 1; i <= n; ++i) sum += dist[i];cout << sum << endl;}return 0;
}

题目3:164可达性统计

C++代码如下,

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <bitset>
#include <vector>using namespace std;const int N = 30010;
int n, m;
int din[N];
bitset<N> f[N]; //f[i]表示结点i能走到的结点
vector<vector<int>> g(N);
vector<int> res;void toposort() {queue<int> q;for (int i = 1; i <= n; ++i) {if (din[i] == 0) {q.push(i);}}while (!q.empty()) {int a = q.front();q.pop();res.emplace_back(a);for (auto b : g[a]) {din[b]--;if (din[b] == 0) {q.push(b);}}}return;
}int main() {cin >> n >> m;for (int i = 0; i < m; ++i) {int a, b;cin >> a >> b;din[b]++;g[a].emplace_back(b);}toposort();for (int i = res.size() - 1; i >= 0; --i) {int a = res[i];f[a][a] = 1;for (auto b : g[a]) {f[a] |= f[b];}}for (int i = 1; i <= n; ++i) {cout << f[i].count() << endl;}return 0;
}

题目4:456车站分级

C++代码如下,

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 2010, M = 1000010;int n, m;
int h[N], e[M], ne[M], w[M], idx;
int q[N], d[N];
int dist[N];
bool st[N];void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;d[b]++;
}void topsort() {int hh = 0, tt = -1;for (int i = 1; i <= n + m; ++i) {if (!d[i]) {q[++tt] = i;}}while (hh <= tt) {int t = q[hh++];for (int i = h[t]; ~i; i = ne[i]) {int j = e[i];if (--d[j] == 0) {q[++tt] = j;}}}
}int main() {scanf("%d%d", &n, &m);memset(h, -1, sizeof h);for (int i = 1; i <= m; ++i) {memset(st, 0, sizeof st);int cnt;scanf("%d", &cnt);int start = n, end = 1;while (cnt--) {int stop;scanf("%d", &stop);start = min(start, stop);end = max(end, stop);st[stop] = true;}int ver = n + i;for (int j = start; j <= end; ++j) {if (!st[j]) add(j, ver, 0);else add(ver, j, 1);}}topsort();for (int i = 1; i <= n; ++i) dist[i] = 1;for (int i = 0; i < n + m; ++i) {int j = q[i];for (int k = h[j]; ~k; k = ne[k]) {dist[e[k]] = max(dist[e[k]], dist[j] + w[k]);}}int res = 0;for (int i = 1; i <= n; ++i) res = max(res, dist[i]);printf("%d\n", res);return 0;
}

3 参考

acwing算法基础之搜索与图论–有向图的拓扑序列


http://www.mrgr.cn/p/22835674

相关文章

寻道大学•逐梦启航

寻道大学•逐梦启航 Seeking the Way, Dreaming of a New Beginning 都匀一中 —— 四川大学站 点此跳转 宣传片(bushi) 点此跳转 宣传片

资源推荐

持续更新中......代码编辑器推荐 c/c++ : visual studio(初学者可用dev c++)点此跳转 python : pycharm点此下载 易语言:点此百度网盘下载 提取码 6678 点此蓝奏云盘下载编程刷题网站 洛谷 leetcode编程学习网站 c语言:bilibili黑马程序员 python:Python_子木 易语言:觅风易…

Selenium IDE 常见错误笔记

错误1&#xff1a;Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时&#xff0c;有两个原因&#xff1a; Firefox阻止了弹出式窗口&#xff0c;在浏览器设置里允许这个操作即可。 有些网站设置了反扒机制&#xff0c;脚本运行…

浮动布局

浮动 应用场景文字环绕(最初的使用场景) 横向排列浮动的基本特点当一个元素浮动后,元素必定为块盒(会更改display为block) 浮动元素的包含块与常规流一致为父元素的内容盒。盒子尺寸宽度为auto时,适应内容高度 高度为auto时,与常规流一致,适应内容高度 margin为auto, 为…

GK320刷机

仓库地址 Gitee页面 https://gitee.com/jeanhua/super-engine-for-GK320 GitHub页面 https://github.com/jeanhua/super-engine-for-GK320 提供GK320/GK310智能电子学生证的破解刷机服务这本来是我高一(2020)用易语言写的,到高二基本完成所有工作,旨在破解这个学生证,给无聊…

客服专用的宝藏快捷回复软件

提起客服&#xff0c;很多人会觉得现在智能机器人的自动回复功能就可以将其替代。我始终不是这么认为的。人工客服始终能为一家店铺乃至一个企业起着非常关键重要的作用。今天就来给大家推荐一个客服专用的宝藏软件——客服宝聊天助手。感兴趣的话&#xff0c;可以发给你的客服…

链式栈接口程序

链式栈接口程序 目录链式栈接口程序以链表作为基础实现栈空间(链式栈)头文件链式栈的创建创建一个空的链式栈节点入栈出栈验证输出结果 以链表作为基础实现栈空间(链式栈) 图解头文件 /********************************************************************* file name: …

Java_web的复习之maven

Apache maven是一个项目管理和构建工具,它基于项目对象管理模型的概念,通过一小段描述信息来管理项目的构建 2.作用:方便的依赖管理 统一的项目结构 标准的项目构建流程 3.通过maven中的各种各样的插件,我们就可以完成对应的功能 例如通过编译插件就可以对项目进行编译,通过…

两个栈模拟一个队列(Stacks Imitate Queue)

/**************************************************************************** @file name: :StacksSimulateQueue* @brief :两个栈实现队列的功能* @author :wvjnuhhail@126.com* @date :2024/04/26* @version 1.0 :V1.0* @property :None* @note :…

如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题

&#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e; 文章目录 &#x1f42f; 如何解决IntelliJ IDEA 2024打开项目时频繁闪退问题 &#x1f43e;摘要引言正文&#x1f4d8; 识别问题&#x1f4d9; 内存配置调整步骤1: 定位vmoptions文件步骤2: 修改…

Rust HTTP 客户端:易于使用、功能强大 | 开源日报 No.228

seanmonstar/reqwest Stars: 8.9k License: Apache-2.0 reqwest 是一个易于使用且功能强大的 Rust HTTP 客户端。 异步和阻塞客户端支持普通数据、JSON、urlencoded 和 multipart 数据格式可定制的重定向策略支持 HTTP 代理和系统原生 TLS 或 rustls 的 HTTPSCookie 存储功能…

DSNeRF复现流程

创建虚拟环境安装依赖 conda create -n DSNeRF python3.7pip install -r requirements.txt下载LLFF数据放在创建的data文件下 https://drive.google.com/file/d/1RjhfcbsywOvw0ts1AFSri91mKANvEVOa/view?uspsharing 下载预先训练好的模型 bash download_models.sh渲染视频…

Qt xml示范

1.数据格式 #ifndef XML_DATA_H #define XML_DATA_H#include<QWidget>struct Student {int s_id;QString s_name;double s_math_score;double s_english_score;}; struct Teacher{int t_id;QString t_name;QVector<Student> t_students_v; };#endif // XML_DATA_H…

Day01 Web服务搭建站库分离路由访问

常规的Web应用搭建: 1.购买云服务器,购买域名2.云服务器去搭建中间件 windows server 安装web角色后默认可以直接通过域名打开网站首页3.下载并上传Web程序源码 zblog源码官网可下载4.添加网站并绑定域名目录 域名解析设置:二级域名ablog.whgojp.top 解析到该服务器zblog程序…

网络安全防护措施:保障信息安全的关键

随着互联网的普及和信息技术的快速发展&#xff0c;网络安全已成为企业和个人必须重视的重要问题。网络安全不仅涉及到保护个人隐私和机密信息&#xff0c;还关系到企业的声誉和财务安全。在这个信息爆炸的时代&#xff0c;制定有效的网络安全防护措施至关重要。本文将探讨几种…

什么是langchain

概念 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。他主要拥有 2 个能力&#xff1a; -可以将 LLM 模型&#xff08;大规模语言模型&#xff09;与外部数据源进行连接 -允许与 LLM 模型进行交互基础功能 支持多种模型接口&#xff0c;比如 OpenAI、Hugging Fac…

c++使用googletest进行单元测试

googletest进行单元测试 使用Google test进行测试一、单元测试二、使用gmock测试 使用Google test进行测试 使用场景&#xff1a; 在平时写代码中&#xff0c;我们需要测试某个函数是否正确时可以使用Google test使用&#xff0c;当然&#xff0c;我们也可以自己写函数进行验证…

什么是储能电站的一次设备与二次设备?

随着国家政策导向和扶持&#xff0c;储能电站的建设&#xff0c;在各地均稳步推进&#xff0c;储能电站的设备主要分一次设备和二次设备两种&#xff0c;下面分别介绍这两方面内容&#xff1a; 储能电站一次设备 一次设备是储能电站的电路基础设施&#xff0c;包含变压器、主…

基于Python实现的推箱子小游戏

Python贪吃蛇小游戏实现: 推箱子曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了&#xff0c;甚至在新一代人的印象中都已毫无记忆了。。。但是&#xff0c;这款游戏可以在一定程度上锻炼自己的编程能力。 运行效果如图所示&#xff1a; 游戏关卡有点…