luogu1347 排序
题目大意
一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列。给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序(能,矛盾,不确定)。确定n个元素的顺序后即可结束程序,可以不用考虑确定顺序之后出现矛盾的情况。
题解
如果A<B,则在图中A结点向B结点连一条有向边,这样,如果出现了矛盾情况,则有向图中出现了环。如果确定了数列的顺序,则图中存在一条链把1~n所有结点都串起来了。换句话说,把这个有向图的边权都设为1,则该有向图中的最长路径为n时,能够确定序列顺序。那么这道题就是拓扑排序的模板题了。
#include <cstdio>
#include <cstdarg>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
#include <string>
#include <iostream>
using namespace std;#define NotVis 0
#define Finished 1
#define InStack -1const int MAX_NODE = 50;struct TopSort
{int N;bool HaveCircle;int MaxDist;struct Node{int Color;//0:NotVis 1:Finished -1:InStackint Dist;vector<Node*> Next;}_nodes[MAX_NODE];stack<Node*> St;void Dfs(Node *cur){if (cur->Color == InStack){HaveCircle = true;return;}if (cur->Color == Finished)return;cur->Color = InStack;for (int i = 0; i < cur->Next.size(); i++){if (HaveCircle)return;Dfs(cur->Next[i]);}cur->Color = Finished;St.push(cur);}TopSort(int n):N(n){}void Build(int from, int to){_nodes[from].Next.push_back(_nodes + to);}void Init(){MaxDist = -1;while (!St.empty())St.pop();HaveCircle = false;for (int i = 1; i <= N; i++)_nodes[i].Color = _nodes[i].Dist = 0;}void GetMaxDist(){if (HaveCircle){MaxDist = -1;return;}stack<Node*> tempSt = St;while (!tempSt.empty()){Node *cur = tempSt.top();tempSt.pop();MaxDist = max(MaxDist, cur->Dist);for (int i = 0; i < cur->Next.size(); i++)cur->Next[i]->Dist = max(cur->Next[i]->Dist, cur->Dist + 1);}}void Proceed(){Init();for (int i = 1; i <= N; i++)Dfs(_nodes + i);GetMaxDist();}
};int main()
{int totNode, opCnt;string s;cin >> totNode >> opCnt;static TopSort g(totNode);for (int i = 1; i <= opCnt; i++){cin >> s;int a = s[0] - 'A' + 1, b = s[2] - 'A' + 1;if (s[1] == '>')swap(a, b);g.Build(a, b);g.Proceed();if (g.HaveCircle){printf("Inconsistency found after %d relations.\n", i);return 0;}else if (g.MaxDist == totNode - 1){printf("Sorted sequence determined after %d relations: ", i);stack<TopSort::Node*> temp = g.St;while (!temp.empty()){printf("%c", (int)(temp.top() - g._nodes) - 1 + 'A');temp.pop();}printf(".\n");return 0;}}printf("Sorted sequence cannot be determined.\n");return 0;
}
转载于:https://www.cnblogs.com/headboy2002/p/9180447.html
luogu1347 排序相关推荐
- 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法
数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...
- 伍六七带你学算法 进阶篇-排序算法
给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...
- python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...
本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...
- Redis 笔记(07)— sorted set 类型(添加、删除有序集合元素、获取分数范围内成员、按score排序、返回集合元素个数)
zset 可能是 Redis 提供的最为特色的数据结构,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权 ...
- Redis 高级特性(1)—— 事务 过期时间 排序
1. Redis 高级特性 -- 事务 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执 ...
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- python 实现桶排序
前言 桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里.每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽 ...
- js数组的排序 sort详解
1.简单数组简单排序 <script type="text/javascript">var arrSimple=new Array(1,8,7,6);arrSimple ...
- java集合中对象某属性比较排序
TreeSet:它可以给Set集合中的元素进行指定方式的排序. 保证元素唯一性的方式:通过比较的结果是否为0. 底层数据结构是:二叉树. 排序的第一种方式: 让元素自身具备比较性.只要让元素实现Com ...
最新文章
- TIOBE 1月编程语言排行榜:C语言再度「C 位」出道,Python惜败
- 如何在 CentOS 7 上安装 Nginx
- Django的模板渲染(render)机制
- SAP中如何实现<生产订单>的批量删除方法!
- 24. PE结构-PE详解之基址重定位详解
- scala读取mysql文件_9. Scala操作外部数据 文件读取,xml,Excel,MySQL
- centos7安装gitlab_Docker常用镜像安装:MySql Redis GitLab maven私服等
- sql union 和 union all
- Compressor 4.6.1 for Mac(视频转码工具)
- paip.c++读写ini文件.
- HCNA-Storage (H13-611)题库 v4.0
- 句子迷 有哪些你第一眼就爱上的电影台词
- 2进制原码反码补码,2进制加减乘除原理
- mysql 基础选择题_MySQL基础之练习题
- java发送outlook_在Outlook 2007中发送民意调查
- 基于DRV8833的步进电机
- TFN高性能无线电综合测试仪让测试更加精准
- Coarse-Grain Fine-Grain Coattention Network for Multi-Evidence Question Answering
- [附源码]java毕业设计房屋中介管理系统
- 瑞康医药的上云之旅:企业数字化转型首先要选好平台