poj 1094 Sorting It All Out
这是一道拓扑排序题;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> using namespace std; class AOV { public: int num; AOV *next; }; class TOP { public: int flag,n,m; AOV *next; }Top[26]; int flag,record[26]; int cent,F; AOV *New_AOV( int num ) { AOV *e = new AOV; e -> num = num; e -> next = NULL; return e; } void build( int n,int num ) { AOV *p,*q; p = Top[num].next; q = New_AOV( n ); q -> next = p; Top[num].next = q; Top[n].n++; Top[n].m = Top[n].n; } int judge( int N ) { int sum = 0 ,t = 0; F=0; while( t < N ) { if( Top[t].n==0 && !Top[t].flag ) { int top = 0; record[sum ++] = t; Top[t].flag = 1; AOV *p = Top[t].next; while( p ) { Top[p->num].n--; if( Top[p->num].n==0 ) top++; p = p -> next; } if( top > 1 ) { F =1; } t = -1; } t++; } for( int i = 0 ; i < N ; i ++ ) { Top[i].n = Top[i].m; Top[i].flag = 0; } if( sum == N && F==1 ) return 2; else if( sum == N && F==0 ) return 0; else return 1; } void find( int N ,int n ) { int sum = 0 ,t = 0; for( int i = 0 ; i < N ; i ++ ) { if( !Top[i].n ) sum++; } if( sum == 0 ) { flag = 1; return ; } if( sum==1 ) { flag = judge( N ); } if( sum > 1 ) { t = judge( N ); if( t == 0 || t == 2) flag = 2; else flag = 1; } } void empty( int N ) { for( int i = 0 ; i < N ; i ++ ) { Top[i].n = Top[i].m = Top[i].flag= 0; Top[i].next = NULL; } } int main( ) { int N,M,cent1; char str[6]; while( scanf( "%d %d",&N,&M )==2,N||M ) { flag = 2; empty( N ); for( int i = 1; i <= M ; i ++ ) { scanf( "%s",str); // printf( "%c %c\n",x,y ); if( flag ==2 ) { build( str[0] - 'A' ,str[2] - 'A' ); find( N ,i); cent = i; } } if( flag ==1 ) printf( "Inconsistency found after %d relations.\n",cent ); else if( flag == 2 ) printf( "Sorted sequence cannot be determined.\n" ); else { printf( "Sorted sequence determined after %d relations: ",cent ); for( int i = N -1 ; i >=0 ; i-- ) { printf( "%c",record[i]+'A' ); } puts( "." ); } } //system( "pause" ); return 0; }