再谈Toplogical sort(pku 1094)

再谈Toplogical sort(pku 1094)
    很久没有在blog上写解题报告了。。。前一阵子都在看书,看算导,看中大的书。。。差点被认为是没有在做ACM了。。。怪我自己。
    在中大的书上看到一段写的不错的toplogical sort的代码,用它来过了一直没过的1094,后来看到kid的代码,发现他写麻烦了。其实判环不用那么麻烦,在拓扑排序里就可以判环了。值得注意的是,每次删点时都要判断是否存在两个或两个以上的入度为0的点,因为这样是不能determin的。如果没有这一步就会wa,比如如下数据:
4 5
A<B
C<D
B<D
A<C
B<D
若没有那么做的话,会在输出
Sorted sequence determined after 4 relations:ACBD.
但是实际上在第四步还没有确定。

代码比kid的短,呵呵。
                                        ——Simbaforrest

代码如下:
#include < iostream >
#include
< cstring >
using namespace std;
int  v,e;
int  deg[ 26 ];
int  sortAns[ 26 ],anstop;
bool adj[
26 ][ 26 ];

int  TopSort()
{
  
int  ret = 1 ;
  bool sure
= true ;
  
// init
  memset(deg, 0 ,sizeof(deg));
  
// count degree
   for ( int  i = 0 ; i < v; i ++ )
  {
    
for ( int  j = 0 ; j < v; j ++ )
    {
      
if (adj[i][j] == true )
        
++ deg[j];
    }
  }
  
// make stack of 0 degree vertex
   int  top =- 1 ;
  
int  cnt = 0 ;
  
for ( int  i = 0 ; i < v; i ++ )
  {
    
if (deg[i] == 0 )
    {
      
++ cnt;
      deg[i]
= top;
      top
= i;
    }
  }
  
if (cnt == 0 )
  {
    sure
= true ;
    
return  ret =- 1 ; // cycle exist
  }
  
if (cnt > 1 )
  {
    sure
= false ;
    ret
= 0 ; // unsure
  } // go on to see if cycle exist
  
  
// sort
  anstop =- 1 ;
  
for ( int  i = 0 ; i < v; i ++ )
  {
    
if (top ==- 1 )
    {
      
// cycle exist
      sure = true ;
      
return  ret  =   - 1 ;
    }
    
else
    {
      
// find j as the 0 degree vertex
       int  j  =  top;
      top 
=  deg[top];
      sortAns[
++ anstop] = j; // record the ans
      
      
// delete the vertex j
      cnt = 0 ;
      
for ( int  ni = 0 ; ni < v; ni ++ )
      {
        
if (adj[j][ni] == true )
        {
          
-- deg[ni];
          
// a new 0 degree vertex
           if (deg[ni] == 0 )
          {
            
++ cnt;
            deg[ni]
= top;
            top 
=  ni;
          }
        }
      }
      
if (cnt > 1 )
      {
        sure
= false ;
        ret
= 0 ; // unsure
      } // go on to see if cycle exist
    }
  }
  
if (sure == false )
    
return  ret = 0 ;
  
return  ret;
}

int  main()
{
  
while (cin >> v >> e, ! (v == 0 && e == 0 ))
  {
    
// init
    memset(adj, 0 ,sizeof(adj));
    bool sure
= false ;
    
    
// read and solve
     for ( int  i = 0 ; i < e; i ++ )
    {
      
char  left,op,right;
      cin
>> left >> op >> right;
      adj[left
- ' A ' ][right - ' A ' ] = 1 ;
      
      
if (sure)
        
continue ;
        
      
int  ret = TopSort();
      
if (ret != 0 )
      {
        sure
= true ;
        
if (ret == 1 )
        {
          cout
<< " Sorted sequence determined after  " << i + 1 << "  relations:  " ;
          
for ( int  j = 0 ; j <= anstop; j ++ )
            cout
<< ( char )(sortAns[j] + ' A ' );
          cout
<< " . " << endl;
        }
        
else   if (ret ==- 1 )
        {
          cout
<< " Inconsistency found after  " << i + 1 << "  relations. " << endl;
        }
      }
    }
    
if (sure == false )
    {
      cout
<< " Sorted sequence cannot be determined. " << endl;
    }
  }
  
return   0 ;
}



你可能感兴趣的:(再谈Toplogical sort(pku 1094))