有向图的拓扑序列

什么是拓扑序列:

若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A中都出现在 y 之前,则称 A是该图的一个拓扑序列。

 (引用blog拓扑序列(拓扑排序)-CSDN博客)

注:

1.拓扑序列只针对有向图来说

2.不是所有图都有拓扑序列

3.有向无环图一定存在拓扑序列,称为拓扑图

模版题目

活动 - AcWing

思路:

1.将所有入度为0的点入队

2.进行bfs,每次取队头,枚举所有出边

代码如下:

#include<bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;int n, m;int e[N], ne[N], h[N], idx;int d[N];vector<int> res;void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void topsort()
{queue<int> q;for(int i = 1;i <= n; i++){if(!d[i]){q.push(i);res.push_back(i);}}while (!q.empty()){auto t = q.front();q.pop();for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];if (!--d[j]){q.push(j);res.push_back(j);}}}if (res.size() == n){for (auto x : res){cout << x << " ";}}else cout << "-1" << endl;
}
int main()
{memset(h, -1, sizeof(h));cin >> n >> m;while (m--){int a, b;cin >> a >> b;add(a, b);d[b]++;}topsort();return 0;
}

例题1

活动 - AcWing

思路:

套模版即可

代码如下:

#include<bits/stdc++.h>using namespace std;const int N = 210;int h[N],ne[N],e[N],idx,d[N];int n;vector<int> res;void tp()
{queue<int> q;for(int i = 1;i <= n; i++){if(!d[i]){q.push(i);res.push_back(i);}}while(!q.empty()){auto t = q.front();q.pop();for(int i = h[t]; i!= -1;i=ne[i]){int j = e[i];if(!--d[j]){q.push(j);res.push_back(j);}}}for(auto x : res)cout<<x<<" ";}void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}int main()
{memset(h,-1,sizeof(h));cin>>n;for(int i = 1; i<=n ;i++){int x;while(cin>>x,x){d[x]++;add(i,x);}}tp();return 0;
}

例题2

活动 - AcWing

思路:

1.套版子

2.注意删边时,奖金比上一个人val加1即可

代码如下:

#include <bits/stdc++.h>using namespace std;const int N = 10010, M = 20010;int n, m;
int h[N], e[M], ne[M], idx;
int in[N];
vector<int> L;void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void topo_sort() {queue<pair<int, int>> q;for (int i = 1; i <= n; i++)if (!in[i]) q.push({ i,100 });while (!q.empty()) {auto t = q.front();q.pop();int pos = t.first, val = t.second;L.push_back(val);for (int i = h[pos]; ~i; i = ne[i]) {int j = e[i];if (!--in[j]) q.push({j,val + 1 });  // 多一元}}
}int main() {memset(h, -1, sizeof h);cin >> n >> m;while (m--) {int x, y;cin >> x >> y;add(y, x), in[x]++;}topo_sort();if (L.size() == n) cout << accumulate(L.begin(), L.end(), 0) << "\n";else cout << "Poor Xed\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/438401.html

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

相关文章

MySQL:三大日志(binlog、redolog、undolog)

再了解三个日志前我们先了解一下MySQL的两层架构&#xff1a; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&#xff0c;查询缓存、解析器、预处理器、优化器、执行器等。另外&#xff0c;所有的内置函数和所有跨…

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(12)

上一篇用MindStudio转换完yolov8的om模型,准备在板卡里进行推理验证了。 我这里用的是我们自己的Tofu5m模块,40mm40mm含外壳尺寸。可以输入网络RTSP视频流直接进行推理。这次用hi3516dv500版本的Tofu5m模块。 SDK里的demo部分是H.264视频输入,为了保持一致来验证,先改成H.…

Mybatis-plus原生pages分页未生效的解决方案

文章目录 前言原因1、Mybatis Plus版本的问题2、Mapper.xml文件中SQL语句格式问题3、Mybatis Plus默认分页拦截器问题4、分页参数传参问题5、分页配置的问题 解决方案1、升级对应的Mybatis-plus版本分页插件配置问题3、自定义分页拦截器4、正确的参数5、不同版本的配置文件3.4.…

Redisson分布式锁介绍及实战应用(防止缓存击穿)

本地锁 浏览器把100w请求由网关随机往下传&#xff0c;在集群情况下&#xff0c;每台服务都放行10w请求过来&#xff0c;这时候每台服务都用的是本地锁是跨JVM的&#xff0c; 列如这些服务都没有49企业&#xff0c;此时有几个服务进行回原了打击在DB上面&#xff0c;那后期把这…

【Java程序设计】【C00172】基于SSM的老年人健康管理系统(论文+PPT)

基于SSM的老年人健康管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的老年人健康管理系统 本系统分为前台、管理员以及用户3个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是首…

java基础 -10 Set之ConcurrentSkipListSet、EnumSet

ConcurrentSkipListSet ConcurrentSkipListSet是java中的集合类&#xff0c;是在多线程的环境中使用的&#xff0c;实现Set接口&#xff0c;它基于跳表(skip List)的数据结构。跳表是一种基于并行排序的数据结构&#xff0c;允许快速的出入&#xff0c;删除和查找操作&#xf…

selenium-Web界面搜索功能测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 测试环境准备&#xff1a; 1、安装Python 2、安装Ch…

浅谈Cookie跨域获取

《浅谈Cookie跨域获取》首发牧马人博客转发请加此提示 浅谈Cookie跨域获取 背景 最近在接入一个第三方的单点登录平台&#xff0c;使用的Oauth2对接的&#xff0c;本来是没啥问题&#xff0c;奈何退出环节他是使用Cookie进行退出的&#xff0c;这时就涉及到了一个跨域问题。看下…

Mysql查询数据

1 基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是&#xff1a; 2 单表查询 2.1 查询所有字段 SELECT * FROM 表名; 2.2 在SELECT语句中指定所有字段 SELECT f_id, s_id ,f_name, f_price FROM fruits; 2.3 查询单个字段 SELECT 列名FR…

RabbitMQ-如何保证消息不丢失

RabbitMQ常用于 异步发送&#xff0c;mysql&#xff0c;redis&#xff0c;es之间的数据同步 &#xff0c;分布式事务&#xff0c;削峰填谷等..... 在微服务中&#xff0c;rabbitmq是我们经常用到的消息中间件。它能够异步的在各个业务之中进行消息的接受和发送&#xff0c;那么…

Python根据Excel表进行文件重命名

一、问题背景 在日常办公过程中&#xff0c;批量重命名是经常使用的操作。之前我们已经进行了初步探索&#xff0c;主要是通过批处理文件、renamer软件或者Python中的pathlib等模块对当前目录下的文件进行批量重命名。 而今天我们要使用的是PythonExcel的方法对指定目录下的文…

Thymeleaf基础教程

系列文章目录 文章目录 系列文章目录一、Thymeleaf 语法规则二、Thymeleaf 语法分为以下 2 类标准表达式语法th 属性2.1 基础语法2.1.1 变量表达式 ${}2.1.2 选择变量表达式 *{}2.1.3 链接表达式 {} 2.1.4 消息表达式 三、常用的 th 标签四、迭代循环 一、Thymeleaf 语法规则 …