poj 1094 Sorting It All Out

这是一道拓扑排序题;

View Code
#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;
}

 

posted @ 2012-07-04 10:18  wutaoKeen  阅读(103)  评论(0编辑  收藏  举报