洛谷1347 排序

news/2025/2/12 0:05:23/

排序

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

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

Sorted sequence determined after x relations: yyy…y.

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

Inconsistency found after x relations.

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

Sorted sequence cannot be determined.

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

样例输入:

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

样例输出:

Sorted sequence determined after 4 relations: ABCD.

思路

这道拓扑题还是比较难的。

首先,一个最基本的思路要有:如果这些关系所构建的图没有环,并且存在一条能遍历所有节点的路径,那么就能确定元素的排列顺序。

没有环应该很好理解,那么后面一点又是为什么呢?

如果这些元素存在合法的排列顺序,设为: x 1 < x 2 < x 3 < . . . < x n x1<x2<x3<...<xn x1<x2<x3<...<xn ,将“<”看作一条边,那么从xn出发,显然能遍历所有的点。

知道了这些,下面的就比较容易了。

用拓扑排序,记录下每个节点的深度,若n个节点的深度也分别为1~n,那么就存在一条能遍历所有节点的路径(正确性请自己思考,虽然我也是瞎猜的)。

判环:拓扑排序结束后还有入度不为0的点,即有环。

代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=100;
queue <pair<int,int> > q;
int n,m,deg[N],a,b,dep[N],du[N];//du记录已经输入的所有边累加起来的入度,deg用来进行拓扑
bool e[N][N],f;
string c;
void tuopu()
{while(!q.empty()){int p=q.front().first,d=q.front().second;//p为当前节点编号,d为当前节点深度q.pop();dep[d]=p;for(int i=1;i<=n;i++)if(e[p][i]){deg[i]--;if(!deg[i]){dep[d+1]=i;//深度为d+1的节点是iq.push(make_pair(i,d+1));}}}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){cin>>c;a=c[0]-'A'+1,b=c[2]-'A'+1;if(!e[b][a])//判重边,否则邻接矩阵会出错(用邻接表可跳过){e[b][a]=1;du[a]++;}for(int j=1;j<=n;j++)deg[j]=du[j];for(int j=1;j<=n;j++)if(!deg[j]) q.push(make_pair(j,1));memset(dep,0,sizeof(dep));tuopu();f=0;for(int j=1;j<=n;j++){if(deg[j])//如果拓扑排序后还有入度不为0的点{printf("Inconsistency found after %d relations.",i);return 0;}if(!dep[j]) f=1;}if(!f)//如果深度1~n都有节点{printf("Sorted sequence determined after %d relations: ",i);for(int j=n;j>0;j--)cout<<char(dep[j]-1+'A');cout<<".";return 0;}}printf("Sorted sequence cannot be determined.");//上面两种情况都不是,就必然是第三种return 0;
}

http://www.ppmy.cn/news/191678.html

相关文章

新手Git+码云入门笔记

1.什么是Git&#xff1f; 2.什么是码云&#xff1f; 3.如何使用Git&#xff1f; 4.如何使用Git码云实现代码管理&#xff1f; 什么是Git&#xff1f; Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大…

iFixit 拆解 2014 款 Mac mini拆机教程, 内存确认不能更换.

著名拆解网站 iFixit 已经完成对 2014 款 Mac mini 的拆解, 确认内存不能更换. 拆解的是标配款机型, 配置 1.4 GHz i5 处理器等. 机身基本和 2012 款相同, 去掉 FireWire 接口, 增加一个 Thunderbolt 接口. 依然是 A1347 型号, 但是改为 EMC 2840. 机身底部没有了以前的大拇指箭…

Rust 笔记:Rust 语言中的 结构体

Rust 笔记 Rust 语言中的 结构体 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/detai…

【PHP】ThinkPhp6期末速通

目录 一、安装Composer二、设置Composer下载源三、Composer下载&#xff0c;安装TinkPHP6四、安装成功后 目录结构五、运行 ThinkPHP6 起步一、MVC二、单应用模式访问调试 三、安装视图四、模板渲染默认访问指定访问 五、模板变量默认赋值助手函数&#xff08;若不使用默认赋值…

Redis的线程模型—文件事件处理器的详解

详细介绍了单线程Reactor模式的概念&#xff0c;以及Redis的线程模型—文件事件处理器的实现。 文章目录 1 Reactor模式2 文件事件处理器2.1 基本概念2.2 通信流程 Redis的线程模型是基于非常经典的单线程Reactor模式&#xff08;netty架构也是基于Reactor模式&#xff09;开发…

Windows调整处理器个数方法

前言&#xff1a; 今天&#xff0c;博主来教大家如何调整处理器个数。最好别闲着没事调它&#xff0c;建议就使用默认的1个处理器个数&#xff0c;一般不会卡&#xff0c;如果电脑存在运行吃力等情况可以调高成1~3之间&#xff0c;如果大于3个则会降低系统稳定性&#xff0c;和…

计算机处理器哪个最好,电脑处理器,哪个比较好

买电脑怎么看处理器&#xff1f;i5、i7差距大吗&#xff0c;高通、锐龙、英特尔处理器哪个好&#xff1f; 单从这个提问就可以看出题主是确实不懂处理器&#xff0c;因为这几个处理器品牌涉及到不同平台&#xff0c;他们是无法拿在一起来对比&#xff0c;英特尔和锐龙这个是PC处…

苹果a7处理器_我认为的最经典的苹果产品

我认为的最经典的苹果产品 1.iPhone 5s 作为最后的乔布斯式的设计&#xff0c;iPhone 5s绝对具有划时代的意义 最美iPhone之一&#xff0c;虽然我更喜欢iPhone 5&#xff0c;但不得不说&#xff0c;iPhone 5s的划时代意义比iPhone 5要更强一些&#xff0c;A7处理器&#xff0c;…