zoukankan      html  css  js  c++  java
  • POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 39602   Accepted: 13944

    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.

    Source

     
    分析:
    有向图判环:拓扑排序
    无向图判环:并查集
     
    本题需要进行m次的拓扑排序
    拓扑排序判环:拓扑之后,如果存在没有入队的点,那么该点一定是环上的点
    拓扑路径的唯一性确定:队中某一时刻存在两个元素,则至少有两条不同的拓扑路径
     
    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<string.h>
    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    int mon1[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int mon2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
    int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
    
    int getval()
    {
        int ret(0);
        char c;
        while((c=getchar())==' '||c=='
    '||c=='
    ');
        ret=c-'0';
        while((c=getchar())!=' '&&c!='
    '&&c!='
    ')
            ret=ret*10+c-'0';
        return ret;
    }
    
    #define max_v 55
    int indgree[max_v];
    int temp[max_v];
    int G[max_v][max_v];
    int tp[max_v];
    int n,m;
    queue<int> q;
    int tpsort()
    {
        while(!q.empty())
            q.pop();
        for(int i=1;i<=n;i++)
        {
            indgree[i]=temp[i];
            if(indgree[i]==0)
                q.push(i);
        }
    
        int c=0,p;
        int flag=0;
        while(!q.empty())
        {
            if(q.size()>1)
                flag=1;
            p=q.front();
            q.pop();
            tp[++c]=p;
            for(int i=1;i<=n;i++)
            {
                if(G[p][i])
                {
                    indgree[i]--;
                    if(indgree[i]==0)
                        q.push(i);
                }
            }
        }
        /*
        拓扑完之后,存在没有入队的点,那么该点就一定是环上的
        */
        if(c!=n)//存在环 
            return 1;
        else if(flag)//能拓扑但存在多条路
            return 0;
        return -1;//能拓扑且存在唯一拓扑路径
    }
    int main()
    {
        int x,y;
        char c1,c2;
        while(~scanf("%d %d",&n,&m))
        {
            if(n==0&&m==0)
                break;
            memset(G,0,sizeof(G));
            memset(temp,0,sizeof(temp));
            memset(tp,0,sizeof(tp));
            int flag1=0,index1=0;//是否有环及环的位置
            int flag2=0,index2=0;//能否拓扑和拓扑的位置
            for(int i=1;i<=m;i++)
            {
                getchar();
                scanf("%c<%c",&c1,&c2);
                x=c1-'A'+1;
                y=c2-'A'+1;
                if(flag1==0&&flag2==0)
                {
                    if(G[y][x])//环的一种情况
                    {
                        flag1=1;
                        index1=i;
                        continue;
                    }
                    if(G[x][y]==0)//预防重边
                    {
                        G[x][y]=1;
                        temp[y]++;
                    }
                    int k=tpsort();
                    if(k==1)//存在环
                    {
                        flag1=1;
                        index1=i;
                        continue;
                    }else if(k==-1)//存在唯一拓扑路径
                    {
                        flag2=1;
                        index2=i;
                    }
                }
            }
            if(flag1==0&&flag2==0)
            {
                printf("Sorted sequence cannot be determined.
    ");
            }else if(flag1)
            {
                printf("Inconsistency found after %d relations.
    ",index1);
            }else if(flag2)
            {
                printf("Sorted sequence determined after %d relations: ",index2);
                for(int i=1;i<=n;i++)
                {
                    printf("%c",tp[i]+'A'-1);
                }
                printf(".
    ");//!!!注意还有个点...
            }
        }
        return 0;
    }
  • 相关阅读:
    Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task(枚举/最大连续子序列)
    Educational Codeforces Round 88 (Rated for Div. 2) A. Berland Poker(数学)
    Educational Codeforces Round 88 (Rated for Div. 2) E. Modular Stability(数论)
    Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water(数学/二分)
    Codeforces Round #644 (Div. 3)
    Educational Codeforces Round 76 (Rated for Div. 2)
    Educational Codeforces Round 77 (Rated for Div. 2)
    Educational Codeforces Round 87 (Rated for Div. 2)
    AtCoder Beginner Contest 168
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9834709.html
Copyright © 2011-2022 走看看