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;
    }
  • 相关阅读:
    mac/unix系统:C++实现一个端口扫描器
    C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP
    PostMan Setting Proxy 设置 代理
    企业架构 Red Hat Drools KIE Project 三大核心产品
    IDS,IPS,IPD
    Vehicle routing with Optaplanner graph-theory
    SonarQube Detection of Injection Flaws in Java, C#, PHP
    Spring AOP Log
    Code Quality and Security | SonarQube
    Gradle vs. Maven: Performance, Compatibility, Speed, & Builds
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9834709.html
Copyright © 2011-2022 走看看