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.
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;
}