zoukankan      html  css  js  c++  java
  • 洛谷 P1347 排序

                                    P1347 排序

    题目描述

    一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列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:
    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:
    1:
    Sorted sequence determined after 4 relations: ABCD.
    2:
    Inconsistency found after 2 relations.
    3:
    Sorted sequence cannot be determined.


    虽说标签是拓扑
    但是完全可以乱搞
    只有26个点 嘿嘿 想怎么搞就怎么搞
    每次输入先判有没有环
    等n个点都出现后
    再判断是否有矛盾
    输入结束后上面两种情况没有出现
    那就是无法确定顺序
     1 #include <cstring>
     2 #include <ctype.h>
     3 #include <cstdlib>
     4 #include <vector>
     5 #include <cstdio>
     6 
     7 const int MAXN=27;
     8 
     9 int n,m,tot;
    10 
    11 int ans[MAXN],out[MAXN],in[MAXN],map[MAXN][MAXN];
    12 
    13 bool vis[MAXN];
    14 
    15 std::vector<int> v[MAXN];
    16 
    17 inline void read(int&x) {
    18     int f=1;register char c=getchar();
    19     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
    20     for(;isdigit(c);x=x*10+c-48,c=getchar());
    21     x=x*f;
    22 }
    23 
    24 inline bool pd() {
    25     for(int k=1;k<=n;++k)
    26       for(int i=1;i<=n;++i)
    27         for(int j=1;j<=n;++j)
    28           map[i][j]=map[i][k]&map[k][j]|map[i][j];
    29     for(int i=1;i<=n;++i)
    30       if(map[i][i]==true) return true;
    31     return false;
    32 }
    33 
    34 void print(int pos,int sum,int id) {
    35     ans[sum]=pos;
    36     if(sum==n) {
    37         printf("Sorted sequence determined after %d relations: ",id);
    38         for(int i=n;i>=1;--i) 
    39           printf("%c",char(ans[i]+'A'-1));
    40         printf(".
    ");
    41         exit(0);
    42     }
    43     for(int i=0;i<v[pos].size();++i) 
    44       print(v[pos][i],sum+1,id);
    45 }
    46 
    47 inline void judge(int id) {
    48     if(pd()) {
    49         printf("Inconsistency found after %d relations.",id);
    50         exit(0);
    51     }
    52     for(int i=1;i<=n;++i)
    53       if(!in[i]) {
    54           print(i,1,id);
    55           break;
    56       }
    57 }
    58 
    59 int hh() {
    60     char s[5];
    61     read(n);read(m);
    62     for(int i=1;i<=m;++i) {
    63         scanf("%s",s);
    64         int x=s[0]-'A'+1;
    65         int y=s[2]-'A'+1;
    66         map[y][x]=true;
    67         v[y].push_back(x),++in[x],++out[y];
    68         if(!vis[x]) ++tot,vis[x]=true;
    69         if(!vis[y]) ++tot,vis[y]=true;
    70         if(pd()) {
    71             printf("Inconsistency found after %d relations.",i);
    72             return 0;
    73         }
    74         if(tot==n) judge(i);
    75     }
    76     printf("Sorted sequence cannot be determined.
    ");
    77     return 0;
    78 }
    79 
    80 int sb=hh();
    81 int main() {;}
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    同花顺笔试碰到的一道前端编程题
    闭包会造成内存泄漏吗?
    动态添加和删除节点元素,函数封装
    58同城2018校招前端笔试题总结
    拼多多2018提前批前端笔试总结
    根据字符串字符的个数排序输出
    ES6数组对象新增方法
    【转】浅析BFC及其作用
    《具体数学》学习笔记
    KMP总结
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7421552.html
Copyright © 2011-2022 走看看