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

目录

  • 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.mzph.cn/web/3544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题出来&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题&#xff0c;帖子链接&#xff1a;《刚刚新安装的OceanBase集群&#xff0c;…

Rime 如何通过 iCloud 实现词库多端同步,Windows、iOS、macOS

Rime 如何通过 iCloud 实现词库多端同步&#xff0c;Windows、iOS、macOS 一、设备环境 最理想的输入环境就是在多端都使用同一个词库&#xff0c;这样能保持多端的输入习惯是一致的。 以我为例&#xff0c;手头每天都要用到的操作平台和对应的输入法&#xff1a; 操作系统设…

39 vue.js

1.1 vue是什么&#xff1f; vue是当下主流的前端框架&#xff0c;用于构建用户界面的 渐进式 自底向上增量开发的MVVM框架。 渐进式&#xff1a;其实每个框架都有自己的特点&#xff0c;在开发的过程中&#xff0c;可以在原有的系统上&#xff0c;把其中一两个功能用VUE…

【热门前端【vue框架】】——vue框架和node.js的下载和安装保姆式教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;程序员-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

如何修复Django中的“ImproperlyConfigured”错误?

在Django中&#xff0c;通常会遇到“ImproperlyConfigured”错误&#xff0c;这表示配置不正确或缺少必要设置。下面是一些常见的修复方法&#xff1a; 检查settings.py文件&#xff1a;确保设置了正确的数据库配置、应用程序、模板路径、静态文件路径等。确保所有必要的设置都…

使用Nginx和内网穿透实现多个本地Web站点的公网访问

在需要将多个本地Web站点暴露到公网的情况下&#xff0c;可以通过Nginx配置文件的修改结合内网穿透技术来实现。下面是具体的步骤和示例&#xff1a; 1. 安装和配置Nginx 首先&#xff0c;确保已经在服务器上安装了Nginx&#xff0c;并且配置了基本的Nginx服务器块&#xff0…

【ARM 裸机】模仿 STM32 驱动开发

1、修改驱动 对于 STM32 来说&#xff0c;使用了一个结构体将一个外设的所有寄存器都放在一起&#xff0c;在上一节的基础上进行修改&#xff1b; 1.1、添加清除 bss 段代码&#xff0c; 1.2、添加寄存器结构体 新建一个文件&#xff0c;命名imx6u.h&#xff0c;注意地址的连…

前端如何优化工程

文章目录 使用CDN1. 请求定位&#xff1a;2.内容缓存&#xff1a;3.负载均衡&#xff1a;4.边缘计算&#xff1a; 优化Webpack1.合理配置Loader&#xff1a;2.优化代码分割&#xff1a;3.压缩和优化输出文件&#xff1a;4.利用Tree Shaking&#xff1a;5.优化解析速度&#xff…

NLP Step by Step -- How to use pipeline

正如我们在摸鱼有一手&#xff1a;NLP step by step -- 了解Transformer中看到的那样&#xff0c;Transformers模型通常非常大。对于数以百万计到数千万计数十亿的参数&#xff0c;训练和部署这些模型是一项复杂的任务。此外&#xff0c;由于几乎每天都在发布新模型&#xff0c…

Linux系统网络---DNS域名解析服务

目录 一、DNS的简介 DNS系统的分布式数据结构&#x1f447; DNS系统类 两种查询方式 二.正向解析实验 1.先关闭防火墙、selinux 2.安装bind 3.查看配置、修改配置 4.修改区域配置文件 正向解析&#x1f447; 反向解析&#x1f447; 5.修改 正向解析&#x1f…

js音频指定扬声器

做音视频开发时候&#xff0c;看到阿里音视频能力&#xff0c;有这个功能&#xff0c;怀着好奇的心去搜索果然发现是有办法做到的&#xff0c;可能比较冷门平时用不到&#xff0c;记录下&#xff1b; const devices await navigator.mediaDevices.enumerateDevices(); const a…

6.Linux常用命令---文件目录管理(3)

6.37 read --读取标准输入命令 read内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入&#xff0c;当使用重定向时&#xff0c;可以读取文件中的一行数据。 read a < 123.txt #读取文件123.txt中的内容&#xff0c;保存到变量a中参数&#xff1a; -a&a…

python环境安装jupyter

1 前提条件&#xff1a;python环境 系统&#xff1a;win10 python&#xff1a;本地已经有python&#xff0c;可以查看本地的python版本&#xff1a; C:\Users\PC>python --version Python 3.8.10 2 安装jupyter并启动 安装jupyter C:\Users\PC>pip install jupyter …

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…

笔试题-构建非二叉树,且非递归遍历-利用栈

普通版本 package com.fang.恒天软件;import java.util.*; import java.util.stream.Stream;public class Tree {TreeNode head;public Tree(TreeNode node) {this.head node;}class ForeachNoMethodException extends Exception {public ForeachNoMethodException(String me…

面试:JVM垃圾回收

一、三种垃圾回收算法 1、标记清除&#xff08;已废弃&#xff09; 找到根对象&#xff08;局部变量正在引用的对象、静态变量正在引用的对象&#xff09;&#xff1b;沿着根对象的引用链&#xff0c;查看当前的对象是否被根对象所引用&#xff0c;若被引用&#xff0c;则加上…

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(一)

​ &#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading &#x1f951;写在前面&#xff1a; 本文对实体的介绍基于论文提出的方案&#xff0c;而非基于 OpenSea 实际采用的方案。 其实右图中的 Alice 也是用了代理的&#xff0c;不过作者没有画出来。 正文…

机器视觉检测为什么是工业生产的刚需?

机器视觉检测在工业生产中被视为刚需&#xff0c;主要是因为它具备以下几个关键优势&#xff1a; 提高精度与效率&#xff1a;机器视觉系统可以进行高速、高精度的检测。这对于保证产品质量、减少废品非常关键。例如&#xff0c;在生产线上&#xff0c;机器视觉可以迅速识别产品…

UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动

UEFI安全启动模式下安装ubuntu的nvidia显卡驱动 实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; 一、NVIDIA官网下载驱动 1.1在浏览器地址栏输入https://www.nvidia.cn/drivers/lookup/进入网站&#xff0c;接着手动驱动搜索&#xff0c;并…

The Clock and the Pizza [NeurIPS 2023 oral]

本篇文章发表于NeurIPS 2023 (oral)&#xff0c;作者来自于MIT。 文章链接&#xff1a;https://arxiv.org/abs/2306.17844 一、概述 目前&#xff0c;多模态大语言模型的出现为人工智能带来新一轮发展&#xff0c;相关理论也逐渐从纸面走向现实&#xff0c;影响着人们日常生活…