acwing 848 有向图的拓扑序列
时间:2019-08-27
本文章向大家介绍acwing 848 有向图的拓扑序列,主要包括acwing 848 有向图的拓扑序列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
地址 https://www.acwing.com/problem/content/description/850/
题目描述
给定一个n个点m条边的有向图,图中可能存在重边和自环。
请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。
若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。
输入格式
第一行包含两个整数n和m
接下来m行,每行包含两个整数x和y,表示点x和点y之间存在一条有向边(x, y)。
输出格式
共一行,如果存在拓扑序列,则输出拓扑序列。
否则输出-1。
数据范围
1≤n,m≤105
样例
输入样例: 3 3 1 2 2 3 1 3 输出样例: 1 2 3
算法1
拓扑排序流程为BFS 流程如下
1 首先找到第一个入度为0 的点 放入待处理队列,记录答案拓扑数组中 拓扑的必要条件
2 然后从该点连接的各个点 做以下操作:
2.1 删除该边后,查看从该点连接的的点的入度
2.2 如果入度为0 那么该点放入待处理队列,记录答案拓扑数组中, 再次进行BFS 直到待处理队列为空
C++ 代码
#include <iostream> #include <iostream> #include <vector> #include <queue> using namespace std; int n, m; vector<vector<int>> outvec(100010, vector<int>()); //入度记录 vector<int> invec(100010, 0);; //出度记录 int main() { cin >> n >> m; for (int i = 0; i < m; i++) { int start; int end; cin >> start >> end; invec[end]++; outvec[start].push_back(end); } queue<int> q; for (int i = 1; i <= n; i++) { //找到第一个入度为0的点 if (invec[i] == 0) { q.push(i); break; } } vector<int> ret; while (!q.empty()) { int idx = q.front(); q.pop(); ret.push_back(idx); //抹掉这个点的所有出度边 与入度计数 for (auto& e : outvec[idx]) { if (e != -1) { invec[e]--; //该点入度减1 if (invec[e] == 0) { q.push(e); } e = -1; //抹掉该边 } } } if(ret.size() == n) for (auto& e : ret) { cout << e << " "; } else cout << -1; return 0; } 作者:defddr 链接:https://www.acwing.com/solution/acwing/content/4196/ 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/itdef/p/11418298.html
- 腾讯云GAME-TECH沙龙干货回顾:网龙《英魂之刃口袋版》开发经验分享
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
- 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络AlexNet
- 黄荣奎:如何快速、便捷开发小程序
- 熊普江: BGP网络架构助力开发者快速构建、优化业务
- 唐良:云端架构给电商行业带来创新力
- 邹方明:看腾讯云如何架构海量存储系统
- 王之捷:AI智能云端架构大幅提升智能语音识别能力
- 精彩大放送 | 腾讯云:容器架构向无服务架构的演进
- Python 数据分析学习笔记
- 如何用Fiddler抓取https
- 人工智能与大数据结合,帮助降低自杀率
- “多态”的数据库连接池实现
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php基于 swoole 实现的异步处理任务功能示例
- PHP中Session ID的实现原理实例分析
- php5.6.x到php7.0.x特性小结
- android自定义加减按钮
- php链式操作的实现方式分析
- php中的依赖注入实例详解
- Android通知栏前台服务的实现
- Laravel 默认邮箱登录改成用户名登录的实现方法
- Android Studio实现简单计算器APP
- 基于PHP实现微信小程序客服消息功能
- python gstreamer实现视频快进/快退/循环播放功能
- php tpl模板引擎定义与使用示例
- ThinkPHP5&5.1框架关联模型分页操作示例
- Android实现简易计算器(可以实现连续计算)
- PHP实现提高SESSION响应速度的几种方法详解