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

    题目链接:http://poj.org/problem?id=1094


    Sorting It All Out
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 35468   Accepted: 12458

    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.




    题解:

    1.由于要输出当关系确定时是第几步,所以每一步都需要进行拓扑排序。(假如读完所有数据再进行拓扑排序,则无法确定关系确定时是第几步)。

    2.在进行拓扑排序时(flag为状态类型,1表示冲突; 2表示不能确定; 3表示关系确定。 flag初始化为3):

    (1) 如果入度为0的点的个数为0,则成环,可直接得出结果:冲突。直接return 1。

    (2) 如果入度为0的点的个数为1,继续。

    (3) 如果入度为0的点的个数大于1,则表明最小的那个不能确定。这时把flag改为2,然后继续。(为什么还要继续,不是可以直接return 2,表明关系还不能确定了吗? 虽然如此,但是继续拓扑排序下去,可能会发现环,即冲突。)




    代码如下:

    #include<stdio.h>//poj 1094
    #include<string.h>
    #include<stdlib.h>
    
    int deg[27], sub_deg[27],edge[27][27],n,m;
    char a,b,c,ans[27];
    
    int TopoSort()
    {
        int flag = 3;
        memcpy(sub_deg,deg,sizeof(deg));
        for(int i = 0; i<n; i++)
        {
            int k, cnt = 0;
            for(int j = 0; j<n; j++)
                if(sub_deg[j]==0) cnt++, k = j;
    
            if(cnt==0) return 1;    //成环
            if(cnt>1) flag = 2;     //最小的不能确定。但不能直接退出,因为接下来可能会出现环。
    
            sub_deg[k] = -1;
            ans[i] = k+65;
            for(int j = 0; j<n; j++)
                if(edge[k][j]) sub_deg[j]--;
        }
        return flag;
    }
    
    int main()
    {
        int flag,step;
        while(scanf("%d%d",&n,&m) && (n||m))
        {
            int finished = 0, flag, step;
            memset(deg,0,sizeof(deg));
            memset(edge,0,sizeof(edge));
            for(int i = 1; i<=m; i++)
            {
                getchar();
                scanf("%c%c%c",&a,&c,&b);
                if(finished) continue;
                deg[b-65]++;
                edge[a-65][b-65] = 1;
    
                ans[n] = 0;
                flag = TopoSort();
                if(flag==1 || flag==3) { step = i; finished = 1; }
            }
    
            if(flag==1)
                printf("Inconsistency found after %d relations.
    ",step);
            else if(flag==2)
                printf("Sorted sequence cannot be determined.
    ");
            else
                printf("Sorted sequence determined after %d relations: %s.
    ",step,ans);
        }
        return 0;
    }
    


  • 相关阅读:
    svg文件使用highmap显示
    动静分离
    angular 零碎
    使用doxmate生成文档
    javascript之console篇
    java 中String与StringBuilder 效率
    highcharts 组合chart
    js 攻坚克难
    html base 又一重大发现
    sql 分析 依赖beanutils
  • 原文地址:https://www.cnblogs.com/DOLFAMINGO/p/7538616.html
Copyright © 2011-2022 走看看