poj1094--Sorting It All Out

Sorting It All Out
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 26449   Accepted: 9156

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

East Central North America 2001
排出n个字母的大小顺序
1. 可以确定出关系
2. 出现错误,(出现环,出现不在n内的字符)
3.出现不能排序,(字符出现的不全,或有多个入度为0的节点)


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stack>
#include <algorithm>
using namespace std;

struct node
{
    int v ;
    node *next ;
}*head[30];
int in[30] ;
stack<int> s ;
void add(char x,char y)
{
    int u = x - 'A' ;
    int v = y - 'A' ;
    in[v]++ ;
    node *p = new node ;
    p->v = v ;
    p->next = head[u];
    head[u] = p ;
}
int dag(int n)
{
    while( !s.empty() )
        s.pop() ;
    int i , a[30] ;
    int flag = 1 ;//1只有一条链,2有两条,-1有环
    for(i = 0 ; i < n ; i++)
    {
        a[i] = in[i] ;
        if(a[i] == 0 && head[i] != NULL)
            s.push(i) ;
        if(a[i] == 0 && head[i] == NULL )
            flag = 2 ;
    }
    while( !s.empty() )
    {
        int l = s.size() ;
        if(l != 1)
            flag = 2 ;
        int u = s.top() ;
        s.pop() ;
        for( node *p = head[u] ; p != NULL ; p = p->next )
        {
            int v = p->v ;
            a[v]-- ;
            if(a[v] == 0)
                s.push(v);
        }
    }
    for(i = 0 ; i < n ; i++)
        if( a[i] != 0 )
        {
            flag = -1 ;
            break;
        }
    return flag ;
}
int main()
{
    int i , j , n , m , k ;
    char a , b , ch ;
    node *p ;
    while(scanf("%d %d", &n, &m)!=EOF)
    {
        if( n == 0 && m == 0)
            break;
        memset(head,NULL,sizeof(head));
        memset(in,0,sizeof(in));
        int flag = 0 ;
        int temp = 0 ;
        for(i = 1 ; i <= m ; i++)
        {
            getchar();
            scanf("%c%c%c", &a, &ch, &b);
            if(flag == 0 && temp == 0 && (a-'A' < 0 || a - 'A' >= n || b - 'A' < 0 || b - 'A' >= n ) )
                flag = i ;
            if(flag == 0 && temp == 0 )
            {
                add(a,b);
                k = dag(n); // -1表示有环,1表示一条链,2表示会有很多
                if(k == -1)
                    flag = i ;
                if(k == 1)
                    temp = i ;
            }
        }
        if( flag != 0 )
            printf("Inconsistency found after %d relations.\n", flag);
        else if(k == 2)
            printf("Sorted sequence cannot be determined.\n");
        else
        {
            while( !s.empty() )
                s.pop() ;
            for(i = 0 ; i < n ; i++)
                if(in[i] == 0)
                    s.push(i);
            printf("Sorted sequence determined after %d relations: ", temp );
            while( !s.empty() )
            {
                int u = s.top() ;
                printf("%c", u+'A');
                s.pop() ;
                for( p = head[u] ; p != NULL ; p = p->next )
                {
                    int v = p->v ;
                    in[v]-- ;
                    if(in[v] == 0)
                        s.push(v);
                }
            }
            printf(".\n");
        }
    }
    return 0;
}


你可能感兴趣的:(poj1094--Sorting It All Out)