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