poj1094

Sorting It All Out

Time Limit: 1000MS
Memory Limit: 10000K
Total Submissions: 14966
Accepted: 5062

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.

解体思路: 拓扑排序,参考了鸵鸟的解体。第一次做topsort,还有些生疏

topsort()
{
    for all nodes in graph:
        find zero indrgee nodes;
        if nodes=0:
              loop occurs;
        else nodes>2
              ambigous nodes
        else
              normal;
        extract nodes from graph;
        extract related edges of nodes, and  re-calculate indegree.
   
}

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

/*
return "AB..." done
        "ambigous"
        "inconsistency"
*/
string topSort(bool map[26][26], int indegree[26], int n)
{
    int indegreeCpy[26];
    int zeroIndegreeNodes;
    string rlt;
    bool ambigous;
    int zeroNodes;

    //init
    for(int i=0; i<n; i++)
        indegreeCpy[i]=indegree[i];
    rlt="";
    ambigous=false;
    //sort
    for(int i=1; i<=n; i++)
    {
        //find zero indegree nodes
        zeroIndegreeNodes=0;
        for(int j=0; j<n; j++)
        {
            if(indegreeCpy[j]==0)
            {
                zeroIndegreeNodes++;
                zeroNodes=j;
            }
        }
        if(zeroIndegreeNodes==0)
        {
            rlt="inconsistency";
            return rlt; //loop occurs
        }
        else if(zeroIndegreeNodes>1)
        {
            ambigous=true;
        }
        //extract zeroNodes
        indegreeCpy[zeroNodes]=-1;
        for(int j=0; j<n; j++)
        {
            if(map[zeroNodes][j])
            {
                indegreeCpy[j]--;
            }
        }
        rlt+=string(1,char(zeroNodes+'A'));
    }
    if(ambigous)
        rlt="ambigous";
    return rlt;
}
int main()
{
    int n,m;
    bool map[26][26];
    int indegree[26];
    string rlt;
    int step;
    char ch1,ch2,chSign;

    while(scanf("%d%d",&n,&m)!=EOF && n!=0 && m!=0)
    {
        //init
        memset(map,0,sizeof(map));
        memset(indegree,0,sizeof(indegree));
        step=1;
        rlt="";

        //solve
        for(int i=1; i<=m; i++)
        {
            getchar();
            scanf("%c%c%c",&ch1,&chSign,&ch2);
            map[ch1-'A'][ch2-'A']=true;
            indegree[ch2-'A']++;
            if(rlt=="" || rlt=="ambigous")
            {
                rlt=topSort(map,indegree,n);
                step=i;
            }
        }

        //rlt
        if(rlt=="inconsistency")
            cout << "Inconsistency found after "<<step<<" relations.\n";
        else if(rlt=="ambigous")
            cout << "Sorted sequence cannot be determined.\n";
        else
            cout << "Sorted sequence determined after "<<step<<" relations: "<<rlt<<".\n";
    }
    return 0;
}

转载于:https://www.cnblogs.com/eric-blog/archive/2011/01/04/1925600.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值