题目描述

一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列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:

  1. 1:
  2. 4 6
  3. A<B
  4. A<C
  5. B<C
  6. C<D
  7. B<D
  8. A<B
  9.  
  10. 2:
  11. 3 2
  12. A<B
  13. B<A
  14.  
  15. 3:
  16. 26 1
  17. A<Z
输出样例#1:

  1. 1:
  2. Sorted sequence determined after 4 relations: ABCD.
  3. 2:
  4. Inconsistency found after 2 relations.
  5. 3:
  6. Sorted sequence cannot be determined.

topo排序

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <queue>
  4. using namespace std;
  5. const int N = ;
  6. queue<int>que;
  7. int n,m;
  8. bool vis[N];
  9. struct node{
  10. int v,next;
  11. }edge[N*N/];
  12. int many=;
  13. int rd[N],rdd[N];int head[N];int num;
  14. void Add_edge(int x,int y)
  15. {
  16. edge[++num].v=y;edge[num].next=head[x];head[x]=num;
  17. }
  18. int cnt;
  19. int can[N];
  20. int topsort()
  21. {
  22. cnt=;int num=;
  23. for(int i=;i<=;i++)
  24. {
  25. rdd[i]=rd[i];
  26. if(rdd[i]==&&vis[i])num++,que.push(i),can[++cnt]=i;
  27. }
  28. if(!num)return ;
  29. bool a=;
  30. while(!que.empty())
  31. {
  32. int u=que.front();
  33. que.pop();int aa=;
  34. for(int i=head[u];i;i=edge[i].next)
  35. {
  36. int v=edge[i].v;
  37. rdd[v]--;
  38. if(rdd[v]==)
  39. {
  40. can[++cnt]=v;
  41. aa++;
  42. if(aa>=)a=;
  43. que.push(v);
  44. }
  45. }
  46. }
  47. if(cnt!=many)return ;
  48. if(num>||a)return ;
  49. return ;
  50. }
  51. int main()
  52. {
  53. scanf("%d%d",&n,&m);
  54. char a[];
  55. for(int i=;i<=m;i++)
  56. {
  57. scanf("%s",a);
  58. int tmp=a[]-'A'+;
  59. int ttmp=a[]-'A'+;
  60. rd[ttmp]++;
  61. if(!vis[tmp])many++;if(!vis[ttmp])many++;
  62. vis[tmp]=; vis[ttmp]=;
  63. Add_edge(tmp,ttmp);
  64. if(topsort()==)
  65. {
  66. printf("Inconsistency found after %d relations.",i);return ;
  67. }
  68. if(!topsort()&&cnt==n)
  69. {
  70. printf("Sorted sequence determined after %d relations:",i);
  71. for(int j=;j<=cnt;j++)
  72. {
  73. putchar(can[i]+'A'-);
  74. }
  75. //if(can)
  76. printf(".");
  77. return ;
  78. }
  79. }
  80. puts("Sorted sequence cannot be determined.");
  81. return ;
  82. }

luogu P1347 排序的更多相关文章

  1. P1347 排序

    P1347 排序 题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们将给你一系 ...

  2. 洛谷——P1347 排序

    洛谷—— P1347 排序 题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们 ...

  3. P1347 排序 (拓扑排序,tarjan)

    题目 P1347 排序 解析 打开一看拓扑排序,要判环. 三种情况 有环(存在矛盾) 没环但在拓扑排序时存在有两个及以上的点入度为0(关系无法确定) 除了上两种情况(关系可确定) 本来懒了一下,直接在 ...

  4. 洛谷 P1347 排序

    题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们将给你一系列形如A<B ...

  5. 洛谷P1347 排序

    这个题看到很多人写Topo排序,其实这道题第一眼看更像是一个差分约束的裸题QWQ... 令dis[x]表示x的相对大小(1是最小,n是最大),显然,对于一个关系A<B,我们有dis[A]< ...

  6. Luogu[YNOI2019]排序(DP,线段树)

    要最优?就要一步到位,不能做"马后炮",走"回头路",因此将序列映射到一个假定最优序列,发现移动原序列等价于删除原序列元素,以便生成最大不下降子序列.可线段树维 ...

  7. POJ1094 Sorting It All Out LUOGU 排序

        Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 40012   Accepted ...

  8. 23-25 October in 614

    Practice sort 给定一系列形如 \(A<B\) 的不等关系,判断前 \(k\) 个不等关系是否即可确定 \(n\) 个元素之间的大小顺序:如果不可确定,判断前 \(k\) 个不等关系 ...

  9. Luogu P3165 [CQOI2014]排序机械臂

    先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...

随机推荐

  1. Python3基本语法

    #编码 ''' 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 ...

  2. Python数据分析-Pandas(Series与DataFrame)

    Pandas介绍: pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的. Pandas的主要功能: 1)具备对其功能的数据结构DataFrame.Series 2)集成时间序 ...

  3. .net的CLR

    搜索:CLR结构图 C#所具有的许多特点都是由CLR提供的,如类型安全(Type Checker).垃圾回收(Garbage Collector).异常处理(Exception Manager).向下 ...

  4. python基础--用python执行系统命令

    from os import system print(system('ping www.baidu.com'))

  5. linux下源代码分析和阅读工具比较

    Windows下的源码阅读工具Souce Insight凭借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”.Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...

  6. pub/sub的实际应用总结

    pub/sub即观察者模式,有多重表现形式 1. Publisher/Subscriber2. Observer/Observable3. Listener(例如EventListener)4. Ev ...

  7. swipe display: none后再显示,加载内容后,滑动失效问题

    只需要添加这两个属性即可: observer:true,//修改swiper自己或子元素时,自动初始化swiper observeParents:true//修改swiper的父元素时,自动初始化sw ...

  8. J2SE总结(一)-------容器

    最近大家都在讨论容器以及如何在项目中去实际的应用它,由于之前对容器没有什么概念,所以把J2SE里面讲的容器的一些基础知识看了一下,总结一下最基本的东西. 围绕整章最核心的就属下面这张图了吧. 一.概念 ...

  9. myeclipse 常规web项目创建

    配置jdk 我的jdk C:\Program Files\Java\jdk1.7.0_67    window --> preferences -->     Java --> In ...

  10. Java并发容器--ConcurrentLinkedQueue

    概述 ConcurrentLinkedQueue是一种基于链表实现的无界非阻塞线程安全队列,遵循先入先出规则. 线程安全队列有两种实现方式: 阻塞方式:对入队和出队操作加锁.阻塞队列. 非阻塞方式:通 ...