zoukankan      html  css  js  c++  java
  • Sorting It All Out(拓扑排序)

    题目:

    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.

    题意:输入n,m,n和m为0的时候输入结束,n代表n个字母,接下来输入m组数据,然后让你根据这m组数据判断是否能将这m个字母排序好,要注意在第i组数据能排序好的时候就输出结果,接下来的数据值输入,不进行判断;

    分析:这是我第一次做有于拓扑排序有关的题目,根据题意我们需要分为三步:①判断是否形成循环 ②判断是否有序 ③无法判断(题目输入的数据不足以判断)

    AC代码:
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define N 30
    char Map[N][N];
    int  indegree[N],p[N];
    int c;
    int toposort(int n)
    {
         c=0;
         int sign=1;
        int temp[N],m,now;
        for (int i=1;i<=n;i++)
            temp[i]=indegree[i];
        for (int i=1;i<=n;i++)
        {
            m=0;
            for (int j=1;j<=n;j++)
                if (temp[j]==0)
                    m++,now=j;
            if (m==0)
                return 0;   //成环
            if (m>1)
                sign=-1;   //无法判断
            p[c++]=now;
            temp[now]=-1;
            for (int j=1;j<=n;j++)
                if (Map[now][j]==1)
                   temp[j]--;
        }
        return sign;  //有序
    }
    int main()
    {
        int n,m;
        char w[5];
        int x,y;
        while (scanf("%d%d",&n,&m)&&(n!=0||m!=0))
        {
            int flag=0;
            memset(Map,0,sizeof(Map));
            memset(indegree,0,sizeof(indegree));
            for (int i=1;i<=m;i++)
            {
    
                scanf("%s",w);
                if (flag)
                    continue;
                x=w[0]-'A'+1;
                y=w[2]-'A'+1;
                Map[x][y]=1;     //x->y
                indegree[y]++;   //后者入度+1
                int t=toposort(n);
                if (t==0)
                    printf("Inconsistency found after %d relations.
    ",i),flag=1;
                else if (t==1)
                {
                    printf("Sorted sequence determined after %d relations: ",i);
                    for(int j=0;j<c;j++)
                        printf("%c",p[j]+'A'-1);
                        printf(".
    ");
                        flag=1;
                }
            }
            if (!flag)
            printf("Sorted sequence cannot be determined.
    ");
        }
        return 0;
    }
  • 相关阅读:
    C++学习9 this指针详解
    福建省第八届 Triangles
    UVA 11584 Partitioning by Palindromes
    POJ 2752 Seek the Name, Seek the Fame
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    HDU 2988 Dark roads(kruskal模板题)
    HDU 1385 Minimum Transport Cost
    HDU 2112 HDU Today
    HDU 1548 A strange lift(最短路&&bfs)
  • 原文地址:https://www.cnblogs.com/lisijie/p/7806044.html
Copyright © 2011-2022 走看看