zoukankan      html  css  js  c++  java
  • Sorting It All Out

    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 24354   Accepted: 8417

    Description

    An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.

    Input

    Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.

    Output

    For each problem instance, output consists of one line. This line should be one of the following three: 

    Sorted sequence determined after xxx relations: yyy...y. 
    Sorted sequence cannot be determined. 
    Inconsistency found after xxx relations. 

    where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence. 

    Sample Input

    4 6
    A<B
    A<C
    B<C
    C<D
    B<D
    A<B
    3 2
    A<B
    B<A
    26 1
    A<Z
    0 0
    

    Sample Output

    Sorted sequence determined after 4 relations: ABCD.
    Inconsistency found after 2 relations.
    Sorted sequence cannot be determined.
    /*
    此题要注意优先级,当在输入的过程中出现环或拓扑排序成功时可以直接输出,但当前驱结点不唯一时不能直接输出,因为后面的输入可能导致出现环,这时候就应该输出矛盾而不是拓扑序列不唯一了,所以判拓扑序列不唯一时应放在输入完毕后;wa了好多次,有想哭的冲动;
    */
     1 #include<stdio.h>
     2 #include<string.h>
     3 int n,m,cnt;
     4 int degree[30];
     5 bool map[30][30],vis[30];
     6 char topo[30];
     7 
     8 int toposort()
     9 {
    10     memset(vis,0,sizeof(vis));
    11     int indegree[30];//函数内部设一个记录入度的数组,尝试着进行拓扑,因为记录入度的外部数组不能随意更改;
    12     int i,j,k,m;
    13     for(i = 0; i < 26; i++)
    14         indegree[i] = degree[i];
    15     cnt = 0;
    16     m = 0;//判断是否有多个前驱结点,注意初始化放在外循环外面;
    17     int count = 0;//记录前驱结点的个数;
    18     for(i = 0; i < n; i++)
    19     {
    20 
    21         for(j = 0; j < n; j++)
    22         {
    23             if(indegree[j] == 0 && !vis[j])
    24             {
    25                 vis[j] = 1;//把该入度为0的结点删除,这里标记为1;
    26                 topo[cnt++]  = j+'A';//进拓扑序列;
    27                 count++;//找到一个前驱结点,计数器加1;
    28 
    29                 for(k = j+1; k < n; k++)
    30                 {
    31                     if(indegree[k] == 0 && !vis[k])
    32                         m = 1;//m=1说明有多个前驱结点,拓扑序列不唯一;
    33                 }
    34                 for(k = 0; k < n; k++)
    35                 {
    36                     if(map[j][k] == 1)
    37                         indegree[k]--;//与j相连的结点入度减一;
    38                 }
    39                 break;
    40             }
    41 
    42         }
    43     }
    44     topo[cnt] = '';
    45     if(count < n)
    46         return -1;//若n次循环后前驱结点数小于n说明有环;
    47     else if(m == 1) return 0;//m=1说明有多个前驱结点,拓扑序列不唯一;
    48     else return 1;
    49 }
    50 int main()
    51 {
    52     int i,res;
    53     char u,v;
    54     while(~scanf("%d %d",&n,&m))
    55     {
    56         if(n == 0 && m == 0)
    57           break;
    58         getchar();
    59         memset(map,0,sizeof(map));
    60         memset(degree,0,sizeof(degree));
    61 
    62         int ok = 0;
    63         for(i = 1; i <= m; i++)
    64         {
    65             if(ok == 0)
    66             {
    67                 scanf("%c<%c",&u,&v);
    68                 getchar();
    69                 degree[v-'A']++;
    70                 map[u-'A'][v-'A'] = 1;
    71                 res = toposort();
    72                 if(res == -1)
    73                 {
    74                     printf("Inconsistency found after %d relations.
    ",i);
    75                     ok = 1;
    76                     continue;
    77                 }
    78                 else if(res == 1)
    79                 {
    80                     printf("Sorted sequence determined after %d relations: ",i);
    81                     printf("%s.
    ",topo);
    82                     ok = 1;
    83                     continue;
    84                 }
    85             }
    86             else
    87             {
    88                 scanf("%c<%c",&u,&v);
    89                 getchar();
    90             }
    91         }
    92         if(ok == 0)
    93             printf("Sorted sequence cannot be determined.
    ");
    94     }
    95     return 0;
    96 }
    View Code
  • 相关阅读:
    有什么样的博客手机客户端
    v2ex thread record
    Screengrab! firefox截图插件
    现在看一次咳嗽感冒就差不多要1k了,恐怖
    海归人才网
    LinkedIn公司实现的实时搜索引擎Zoie
    xipian的php中文分词
    海归人才网
    idea
    snagit number stampsgood for ppt
  • 原文地址:https://www.cnblogs.com/LK1994/p/3248676.html
Copyright © 2011-2022 走看看