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;

}

 

你可能感兴趣的:(sort)