当前位置: 首页 > news >正文

洛谷 P1347 排序(福建省历届夏令营)(图论:拓扑排序)

题目描述

一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列 A,B,C,D表示 A<B,B<C,C<D。在这道题中,我们将给你一系列形如 A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序。

输入格式

第一行有两个正整数 n,m 表示需要排序的元素数量,2≤n≤26,第 1 到 n 个元素将用大写的 A,B,C,D,…A,B,C,D,… 表示。m 表示将给出的形如 A<B 的关系的数量。

接下来有 m 行,每行有 3 个字符,分别为一个大写字母,一个 < 符号,一个大写字母,表示两个元素之间的关系。

输出格式

若根据前 x 个关系即可确定这 n 个元素的顺序 yyy..y(如 ABC),输出

Sorted sequence determined after xxx relations: yyy...y.

若根据前 x 个关系即发现存在矛盾(如 A<B,B<C,C<A),输出

Inconsistency found after x relations.

若根据这 m 个关系无法确定这 n 个元素的顺序,输出

Sorted sequence cannot be determined.

(提示:确定 n 个元素的顺序后即可结束程序,可以不用考虑确定顺序之后出现矛盾的情况)

输入输出样例

输入 #1复制

4 6
A<B
A<C
B<C
C<D
B<D
A<B

输出 #1复制

Sorted sequence determined after 4 relations: ABCD.

输入 #2复制

3 2
A<B
B<A

输出 #2复制

Inconsistency found after 2 relations.

输入 #3复制

26 1
A<Z

输出 #3复制

Sorted sequence cannot be determined.

说明/提示

2≤n≤26,1≤m≤600。

这道题考察的是拓扑排序,AcWing 1191. 家谱树(图论,拓扑排序的模板)-CSDN博客 模板在这

我们简单讲讲思路,我们把输出分成三种形式(题目描述先后对应1、2、3),第1种是可以判断得出完整拓扑排序的情况,第2种是有环的情况,第3种就是这两个之外直接输出

第2种:首先判断是否形成环了,做法:记录出现的字母个数,如果最后得到的拓扑序列的大小 小于字母个数,那么就是形成环了

第1种:必须严格的得出所有字母之间的关系,也就是说记录出现字母的个数必须等于拓扑序列的大小而且队列的大小要保持为1,如果超过1了说明有不确定的关系

代码:

#include <bits/stdc++.h>
using namespace std;const int N = 30;
int ind[N],oud[N],cpy[N];
vector<int> e[N];
bool b[N];int n,m,cnt = 0,type = 0;void topsort(int idx){memcpy(ind,cpy,sizeof(cpy));queue<int> q;string ans = "";bool ac = true;for(int i=1;i<=n;i++){if(!b[i]) continue;if(!ind[i]) q.push(i);}while(!q.empty()){if(q.size() >= 2) ac = false;int u = q.front();q.pop();ans += char(u) + 64;for(auto v : e[u]){ind[v] --;if(!ind[v]) q.push(v);}}// if(idx == 28) cout << ans << " " << ans.size() << " " << cnt << endl;if(ans.size() < cnt){// cout << ans.size() << " " << cnt << endl;type = 2;printf("Inconsistency found after %d relations.\n",idx);}if(ans.size() == n && ac){type = 1;printf("Sorted sequence determined after %d relations: ",idx);cout << ans << "." << endl;}
}int main()
{cin >> n >> m;string s;for(int i=1;i<=m;i++){cin >> s;if(type) continue;int A = s[0] - 64,B = s[2] - 64;// cout << A << " " << B << endl;if(!b[A]){b[A] = true;cnt ++;}if(!b[B]){b[B] = true;cnt ++;}if(s[1] == '<'){cpy[B] ++,oud[A] ++;e[A].push_back(B);}else{cpy[A] ++,oud[B] ++;e[B].push_back(A);}topsort(i);}if(!type) cout << "Sorted sequence cannot be determined." << endl;return 0;
}

加油

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 暂存篇:高频面试题基本总结回顾(含笔试高频算法整理)
  • windows中node版本的切换(nvm管理工具),解决项目兼容问题 node版本管理、国内npm源镜像切换(保姆级教程,值得收藏)
  • Spring-创建bean
  • 谷粒商城实战笔记-122~124-全文检索-ElasticSearch-分词
  • JVM—虚拟机类加载器
  • 机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测
  • 华为的流程体系
  • 【大模型】【面试】独家总结表格
  • ISA95-Part8-错误处理的设计与集成
  • 【二】测试工具
  • 21天学通C++:理解函数对象、Lambda表达式
  • 微信小程序css中配置了文字超出一行或两行则显示省略号对纯数字或纯字母或小数点无效的解决办法
  • C Primer Plus 第5章——第一篇
  • C++ | Leetcode C++题解之第318题最大单词长度乘积
  • git clone private repo
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【node学习】协程
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • github从入门到放弃(1)
  • JavaScript的使用你知道几种?(上)
  • JavaScript异步流程控制的前世今生
  • k8s 面向应用开发者的基础命令
  • LeetCode算法系列_0891_子序列宽度之和
  • linux学习笔记
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mysql 5.6 原生Online DDL解析
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • React-redux的原理以及使用
  • Vue2.x学习三:事件处理生命周期钩子
  • vuex 学习笔记 01
  • 测试如何在敏捷团队中工作?
  • 从0到1:PostCSS 插件开发最佳实践
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用docker-compose进行多节点部署
  • 用Canvas画一棵二叉树
  • 函数计算新功能-----支持C#函数
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ## 基础知识
  • #APPINVENTOR学习记录
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (javaweb)Http协议
  • (翻译)terry crowley: 写给程序员
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (六)软件测试分工
  • (排序详解之 堆排序)
  • (三)Honghu Cloud云架构一定时调度平台
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .net 7 上传文件踩坑
  • .NET C# 操作Neo4j图数据库
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes