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;
}


posted on 2007-07-25 14:13  woodfish  阅读(546)  评论(0编辑  收藏  举报

导航