Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 26449 | Accepted: 9156 |
Description
Input
Output
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
#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; }