题目大意

  一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列。给你一系列形如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 -1 const int MAX_NODE = 50; struct TopSort
{
int N;
bool HaveCircle;
int MaxDist; struct Node
{
int Color;//0:NotVis 1:Finished -1:InStack
int 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;
}

  

luogu1347 排序的更多相关文章

  1. <luogu1347>排序

    本来打算当打了个拓扑的板子 后来发现并不只是个板子 差不多 管他呢 #include<cstdio> #include<cstring> #include<iostrea ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  4. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  5. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  6. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  7. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  8. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  9. javascript排序

    利用array中的sort()排序 w3cfunction sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = " ...

随机推荐

  1. 微信小程序左右滑动切换页面示例代码--转载

    微信小程序——左右滑动切换页面事件 微信小程序的左右滑动触屏事件,主要有三个事件:touchstart,touchmove,touchend. 这三个事件最重要的属性是pageX和pageY,表示X, ...

  2. 【SQL】日期型函数

    1. SYSTATE 用来返回系统当前时间 SQL> select sysdate from dual; SYSDATE ------------------- 2017-03-03 09:49 ...

  3. mssql server 2005自动备份数据库

    (转) (1)启动[sql server Management Studio],在[对象资源管理器]窗口里选择[管理]——[维护计划]选项. 2)右击[维护计划],在弹出的快捷菜单里选择[维护计划向导 ...

  4. 多开 MFC线程

    序言:我才编程几年啊!就要处理多线程.对于只写函数的我,这难度简直了!不过MFC的多线程,貌似比较简单,还能处理的了. (1).开MFC多个线程 在视频采集的过程中,如果不使用媒体计数器,会造成主线程 ...

  5. 测试模式 windows2008 内部版本7601

    win server 2008 r2 enterprise 64位系统. 最近手贱,对服务器进行了一下更新,结果傻叉了,这是什么鬼,明明显示已经激活的,但就是有这么一串碍眼的字幕. 电脑右下角居然出现 ...

  6. day008 字符编码之 字符编码 、Python2和Python3字符编码的区别

    计算机基础(掌握) 启动应用程序的流程 双击qq 操作系统接受指令然后把该操作转化为0和1发送给CPU CPU接受指令然后把指令发送给内存 内存接受指令把指令发送给硬盘获取数据 qq在内存中运行 文本 ...

  7. SSL证书在线申请和取回证书指南

    1.客服下单后用户会收到一封邮件,来验证接收证书的邮箱;如图1所示:只有完成此邮箱验证才能正常申请证书; 请注意:为了确保您或您的用户能正常收到WoSign证书管理系统自动发送的邮件,请一定要把系统发 ...

  8. window.open方法被浏览器拦截的处理方式

    问题现象 当我们在一个 ajax 回调中执行 window.open 方法时,新页面会被浏览器拦截. 原因 在 Chrome 的安全机制里,非用户直接触发的 window.open 方法,是会被拦截的 ...

  9. 配置Jupyter

    前几天见同学有用Jupyter notebook的,有点喜欢,于是今天自己配了一下. Jupyter是一个非常好用编辑器,因为Jupyter notebook 不仅可以编写代码运行,并且可以直接在代码 ...

  10. Windows Server 2008 R2x64 IIS7+PHP5.6 错误 500.0

    这两天准备升级一个网站项目,新项目基于PHP并进行了ZendGuard加密,需要在PHP5.6版本中运行 而客户之前的运行环境是php5.2~5.4,那好,再新建一个PHP版本不就完事了吗!!! 于是 ...