zju 1060 拓扑排序

刚看这题感觉是个排序网络,然后就去翻组合数学中的排序网络一章,看了半天感觉对这题没什么作用,后来再把题目一看,发现就是个图论的问题。假设有关系A<B,我们就在图中建立一条边A->B,这样要判断所有的关系是否能够给出最后的元素的序,就只需要对该图进行拓扑排序,如果该图存在环,那么给定的关系肯定是互相矛盾的。如果不存在环,但是拓扑排序出来的序列中元素的个数不完整(入度为0的节点的个数大于1),那么给出的关系不足以判断出最后的大小关系。如果拓扑排序出来的序列中元素的个数是完整的,那么给出的关系可以判断出最后的大小关系。

#include  < stdio.h >
#include 
< vector >
using   namespace  std;

int  ideg[  26  ],idegtemp[  30  ];
char  buffer[  10  ],seq[  30  ];
bool  e[  30  ];
int  n,pairs;
vector
<  vector < char >   >  v;

int  toposort(  int  vv ) {
    
int  i,idx,r = 0 ,cnt = 0 ,flag;
    
for ( i = 0 ;i < n;i ++  ) idegtemp[ i] = ideg[ i ];
    flag
= 1 ;
    
while ( vv --  ) {
    cnt
= 0 ;
    
for ( i = 0 ;i < n;i ++  )
        
if ( idegtemp[ i ] == 0  ) {
        idx
= i;
        cnt
++ ;
        }
    
if ( cnt >= 1  ) {
        
if ( cnt > 1  ) flag = 0 ;
        
for ( i = 0 ;i < v[ idx ].size( );i ++  ) 
        idegtemp[ v[ idx ][ i ] ]
-- ;
        seq[ r
++  ] = idx + ' A ' ;
        idegtemp[ idx ]
=- 1 ;
        seq[ r ]
= 0 ;
    }
else   if ( cnt == 0  )  return   - 1 ;
    }
    
if ( flag )  return  r;  else   return   0 ;
}

int  main( ) {
    
int  i,j,ii,cnt,flag,temp;
    
while ( scanf(  " %d %d " , & n, & pairs ) == 2 && n ) {
    
for ( i = 0 ;i < 26 ;i ++  ) {
        ideg[ i ]
= 0 ;
        e[ i ]
= false ;
    }
    v.clear(  );
    v.resize( n );
    cnt
= 0 ;
    flag
= 0 ;
    
for ( i = 0 ;i < pairs;i ++  ) {
        scanf( 
" %s " ,buffer );
        ideg[ buffer[ 
2  ] - ' A '  ] ++ ;
        v[ buffer[ 
0  ] - ' A '  ].push_back( buffer[  2  ] - ' A '  );
        
if ! e[ buffer[  0  ] - ' A '  ] ) {
        cnt
++ ;
        e[ buffer[ 
0  ] - ' A '  ] = true ;
        }
        
if ! e[ buffer[  2  ] - ' A '  ] ) {
        cnt
++ ;
        e[ buffer[ 
2  ] - ' A '  ] = true ;
        }
        
if ( flag == 0  ) {
        temp
= toposort( cnt );
        
if ( temp ==- 1  ) {
            flag
=- 1 ;
            ii
= i + 1 ;
        }
else   if ( temp == n ) {
            flag
= 1 ;
            ii
= i + 1 ;
        }
        }
    }
    
if ( flag ==- 1  )
        printf( 
" Inconsistency found after %d relations.\n " ,ii );
    
else   if ( flag == 0  )
        printf( 
" Sorted sequence cannot be determined.\n "  );
    
else
        printf( 
" Sorted sequence determined after %d relations: %s.\n " ,ii,seq );
    }
    
return   0 ;
}


你可能感兴趣的:(排序)