【问题描述】

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

【输入文件】

第一行有两个整数n,m,n表示需要排序的元素数量,2<=n<=26,第1到n个元素将用大写的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 2 relations.

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

Sorted sequence cannot be determined.

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

【样例输入】

1:

4 6

A<B

A<C

B<C

C<D

B<D

A<B

2:

3 2

A<B

B<A

3:

26 1

A<Z

【样例输出】

1:

Sorted sequence determined after 4 relations: ABCD.

2:

Inconsistency found after 2 relations.

3:

Sorted sequence cannot be determined.

【题解】

这题要用到拓扑排序。

首先把输入的关系看做是一条条边。

A..Z对应数字1..26;

然后所有点的入度一开始为-1.表示都没有出现过。

然后A<B,则为一条从A指向B的有向边。

然后B的入度递增。

然后A的入度如果为-1则改为0,表示其出现过。

然后若是加入这条边之后有某个点没有出现过。那就不可能构成序列。

然后是判环的方法。

加入一个变量num.记录的是那些加入过topsort队列中的元素(用队列来完成topsort)

在进行完topsort之后。

记录入度信息的数组不要着急还原成原来的样子。

然后如果num<n(说明没有完成topsort),且在1..n中发现有1个节点它的入度是大于0的,那就说明出现了环。(如果是因为有元素没有出现而不能完成topsort则所有存在的点在尝试topsort后它们的入度都会等于0)

不能单纯地写成if (不存在未出现的点 && num < n) 来判断是否有环。

因为就算存在未出现的点也可能有环。比如n=5.

你只要在前4个点之间弄一个环。所得到的num依然是小于5.且存在未出现的点。

然后如果进行topsort的时候。发现尾节点和头结点的差在递增头结点之后还是大于等于1.则不能够确定该序列。因为这就说明同时出现了两个入度为0的点。而这是不允许的!

因为这样你就不能确定下一个数字是啥了。

然后会出现重边的情况。

然后输出完整序列的时候要加上末尾的点号!!!

【代码】

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. int n, m, ru[27],dl[10000],head,tail,w[27][27];
  5.  
  6. int main()
  7. {
  8. memset(ru, 255, sizeof(ru));//一开始赋值为-1是表示没有出现过某个点。
  9. scanf("%d%d", &n, &m);
  10. for (int i = 1; i <= m; i++)
  11. {
  12. char s[20];
  13. scanf("%s", s);
  14. int x = s[0] - 'A' + 1, y = s[2] - 'A' + 1;
  15. if (!w[x][y])//会有重边!!!
  16. {
  17. if (ru[y] == -1) //如果y的入度为-1则改为0表示出现过。
  18. ru[y] = 0;
  19. if (ru[x] == -1)//同理x如果出现了也改为0
  20. ru[x] = 0;
  21. w[x][y] = 1;//一条有向边由x指向y
  22. ru[y]++;//y的入度递增、
  23. }
  24. int zero = 0,fushu = 0;//统计入度为0和没有出现的点的个数。
  25. bool notenough = false;//判断能不能得出序列。
  26. head = 0, tail = 0;
  27. for (int j = 1; j <= n; j++)
  28. if (ru[j] == 0)//入度为0则递增zero
  29. {
  30. zero++;
  31. tail++;//同时把该点加入队列中进行topsort
  32. dl[tail] = j;
  33. }
  34. else
  35. if (ru[j] == -1)//找到没有出现的点也记录。
  36. fushu++;
  37. if (zero == 0)//如果没有一个入度为0的点。则说明出现了环。则输出错误信息即可。
  38. {
  39. printf("Inconsistency found after %d relations.", i);
  40. return 0;
  41. }
  42. if (zero > 1 || fushu >0)//如果入度为0的点大于1个或有未出现的点。则说明不足以确定序列。
  43. notenough = true;//但是还要判断是不是出现了环。
  44. int num = tail;//num是进行topsort的点的个数。
  45. int tempru[27];
  46. for (int i = 1; i <= n; i++)//因为接下来的topsort会改变ru数组。所以先用temp记录一下原来的ru
  47. tempru[i] = ru[i];
  48. while (head != tail)
  49. {
  50. head++;
  51. if (tail > head) //如果递增了头结点 尾节点还大于头结点。则说明有2个入度为0的点同时出现。
  52. notenough = true;//则不足以构成序列。
  53. int x = dl[head];
  54. ru[x] = -1;//把这个点的入度置为-1
  55. for (int j = 1; j <= n;j++)//然后找其出度
  56. if (w[x][j] == 1)
  57. {
  58. ru[j]--;//出度的入度递减
  59. if (ru[j] == 0)//如果也变成0了。则加入到队尾
  60. {
  61. num++;//进行过topsort的点数递增;
  62. tail++;
  63. dl[tail] = j;
  64. }
  65. }
  66. }
  67. if (num < n)//不能进行完整的topsort
  68. {
  69. for (int j = 1; j <= n; j++)
  70. if (ru[j] > 0)
  71. {
  72. printf("Inconsistency found after %d relations.", i);
  73. return 0;
  74. }
  75. }
  76. for (int i = 1; i <= n; i++)//把ru之前的状态回溯一下。
  77. ru[i] = tempru[i];
  78. if (notenough && i == m)//如果不足以判断且已经是最后一条边了。则输出无法判断
  79. printf("Sorted sequence cannot be determined.");
  80. if (num == n && !notenough)//如果所有的点都进行了topsort。且足以判断。则输出信息。
  81. {
  82. printf("Sorted sequence determined after %d relations: ", i);
  83. for (int j = 1; j <= tail; j++)//把topsort序列输出一遍。
  84. {
  85. char key = dl[j] + 'A' - 1;
  86. putchar(key);
  87. }
  88. putchar('.');//这个点号也是很坑啊。。。
  89. return 0;
  90. }
  91. }
  92. return 0;
  93. }

【u019】排序(sort)的更多相关文章

  1. Lucene 排序 Sort与SortField

    在sql语句中,有升序和降序排列.在Lucene中,同样也有. Sort里的属性 SortField里的属性 含义 Sort.INDEXORDER SortField.FIELD_DOC 按照索引的顺 ...

  2. 转:详细解说 STL 排序(Sort)

    详细解说 STL 排序(Sort) 详细解说 STL 排序(Sort) 作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1. ...

  3. 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

    模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...

  4. [js] - 关于js的排序sort

    js的排序sort并不能一次排序好 function solution(nums){ return nums.sort(sortNumber); } function sortNumber(a, b) ...

  5. 给乱序的链表排序 · Sort List, 链表重排reorder list LoLn...

    链表排序 · Sort List [抄题]: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: quick ...

  6. 详细解说 STL 排序(Sort)(转)

    作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1.1 所有sort算法介绍 1.2 sort 中的比较函数 1.3 sor ...

  7. Excel VBA解读(54):排序——Sort方法

    Excel VBA解读(54):排序——Sort方法 看看下面的Excel界面截图,“排序”和“筛选”往往在一起,这大概是很多数据需要先排序后筛选吧  首先以“性别”作为排序字段,升序排列,并且第一行 ...

  8. sort排序,按指定字段进去重,sort -t "^" -k 8 -su,ls给文件名中数字排序sort -k1.5n,Tab符要转义

    sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序. sort语法 ...

  9. 详细解说 STL 排序(Sort)

    0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...

随机推荐

  1. [NOI2008]假面舞会(DFS)

    Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...

  2. 【Educational Codeforces Round 35 A】 Nearest Minimums

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找出最小的数字的位置. 最近的肯定是相邻的某对. [代码] #include <bits/stdc++.h> using ...

  3. 12.模板别名以及auto定义返回值

    #include <iostream> #include <array> using namespace std; //定义返回值类型 template<class T1 ...

  4. 利用jquery.fullPage.js 和 scrolloverflow.min.js 实现滚屏效果

    参考链接:https://blog.csdn.net/c11073138/article/details/79631036 /* 按着思路去search. */

  5. JS学习笔记 - fgm练习 - 鼠标移入/移出div样式改变

    思路: div的默认样式正常设置. 鼠标移入时,发生改变的样式有3个,即 边框颜色,div背景色,字体颜色. 把这三个css改变设置在一个类名下,再通过js给div动态 添加/去除这个类名,实现div ...

  6. jmeter--使用badboy录制脚本

    JMeter录制脚本有多种方法,其中最常见的方法是用第三方工具badboy录制,另外还有JMeter自身设置(Http代理服务器+IE浏览器设置)来录制脚本,但这种方法录制出来的脚本比较多且比较乱,个 ...

  7. MAVEN Error: Using platform encoding (GBK actually) to copy filtered resources.....

    环境:Maven3.2.5+MyEclipse 2015CI 现象:在Maven编译过程中出现错误信息:Using platform encoding (GBK actually) to copy f ...

  8. PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)

    PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...

  9. POJ 1384 Piggy-Bank (ZOJ 2014 Piggy-Bank) 完全背包

    POJ :http://poj.org/problem?id=1384 ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode ...

  10. debian 下的vi 上下左右键问题

    小白一只,查了一下vi的版本信息 发现好像是vim 于是把~/.vimrc 变量设置了一下就好了。 将set compatible 设置成set nocompatible . 这是因为系统会默认vim ...