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

    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了几次,后来才知道是每次都应该考虑一下,于是才AC的
    #include<map>
    #include<set>
    #include<stack>
    #include<queue>
    #include<cmath>
    #include<vector>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define  inf 0x0f0f0f0f
    
    using namespace std;
    
    int group[27][27],indegree[27],in[27],list[27],n,m;
    vector<int>G[27];
    
    int top_sort()
    {
        int flag=0;
        for (int i=0;i<n;i++) in[i]=indegree[i];
        stack<int>S;
        for (int i=0;i<n;i++)
        {
            if (in[i]==0) S.push(i);
        }
        if (S.size()>1) flag=1;
        int cut=0;
        while(!S.empty())
        {
            if (S.size()>1) flag=1;
            int u=S.top();
            S.pop();
            list[cut++]=u;
            for (int i=0;i<G[u].size();i++)
            {
                int v=G[u][i];
                in[v]--;
                if (in[v]==0) S.push(v);
            }
        }
        if (cut<n) return 1;//maodun
        if (flag==1) return 2;//don't sure
        return 0;//ok
    }
    
    int main()
    {
        int error,ok,x,y;
        char str[5];
        while(scanf("%d%d",&n,&m)!=EOF && n && m)
        {
            memset(group,0,sizeof(group));
            memset(indegree,0,sizeof(indegree));
            for (int i=0;i<=n;i++) G[i].clear();
            error=0; ok=0;
            for (int i=1;i<=m;i++)
            {
                scanf("%s",str);
                x=str[0]-'A';
                y=str[2]-'A';
                if (error==0 && ok==0)
                {
                    if (group[y][x]==1)
                    {
                        error=1;
                        printf("Inconsistency found after %d relations.
    ",i);
                        continue;
                    }
                    if (group[y][x]==0)
                    {
                        if (group[x][y]==0){
                            group[x][y]=1;
                            G[x].push_back(y);
                            indegree[y]++;
                        }
                        int temp=top_sort();
                        if (temp==1)
                        {
                            error=1;
                            printf("Inconsistency found after %d relations.
    ",i);
                        }
                        if (temp==0)
                        {
                            ok=1;
                            printf("Sorted sequence determined after %d relations: ",i);
                            for (int j=0;j<n;j++) printf("%c",list[j]+'A');
                            printf(".
    ");
                        }
                        if (temp==2) continue;
                    }
                }
            }
            if (error==0 && ok==0)
            printf("Sorted sequence cannot be determined.
    ");
        }
        return 0;
    }

    作者 chensunrise

    至少做到我努力了
  • 相关阅读:
    ajax专题
    luogu P1346 电车 最短路
    luogu P1462 通往奥格瑞玛的道路 最短路
    luogu P1328 生活大爆炸版石头剪刀布
    luogu P1315 联合权值 枚举
    luogu P1156 垃圾陷阱 背包问题
    luogu P1217 回文质数 枚举
    luogu P3650 滑雪课程设计 枚举
    luogu1209 修理牛棚 贪心
    luogu P1223 排队接水 贪心
  • 原文地址:https://www.cnblogs.com/chensunrise/p/3760431.html
Copyright © 2011-2022 走看看