题目的意思是给你一个偏序关系集,问这个关系是否是良序的。使用了拓扑排序。
#include <stdio.h>

int map[26][26];
int op_m[26][26];

int count[26];
int op_c[26];

char road[26];
int len;

int que[1000];
int head, tail;

void initq ()
{
    head 
= 0;
    tail 
= -1;
}


void inq ( int *in )
{
    
    que[
++tail] = *in;
}


void outq ( int *out )
{
    
*out = que[head++];
}


int gets ()
{
    
    
return tail - head + 1;
}


void init ( int n )
{
    
    
for ( int i=0; i<n; i++ )
    
{
        
for ( int j=0; j<n; j++ )
        
{
            map[i][j] 
= 0;
        }

        count[i] 
= 0;
    }

}


void cpy ( int n )
{
    
    
for ( int i=0; i<n; i++ )
    
{
        
for ( int j=0; j<n; j++ )
        
{
            op_m[i][j] 
= map[i][j];
        }

        op_c[i] 
= count[i];
    }

}


void add ( char a, char b )
{
    
    
if ( ! map[ a-'A' ][ b-'A' ] )
    
{
        map[ a
-'A' ][ b-'A' ] = 1;
        count[ b
-'A' ] ++;
    }

}


int sort ( int n ) /*排序返回结果:1成功, 0有环,-1有多种情况*/
{
    
    
int out;
    
int flag = 1;
    
    len 
= 0;
    initq ();
    cpy ( n );
    
    
for ( int i=0; i<n; i++ )
    
{
        
if ( ! op_c[i] )
        
{
            inq ( 
&i );
            op_c[i] 
= -1;
        }

    }

    
    
while ( gets () )
    
{    
        
if ( gets () > 1 )
        
{
            flag 
= 0;
            len 
= 0;
        }

        
        outq ( 
&out );
        
if ( flag )
        
{
            road[len
++= out + 'A';
        }

        
for ( int i=0; i<n; i++ )
        
{
            
if ( op_m[out][i] )
            
{
                op_m[out][i] 
= 0;
                op_c[i] 
--;
            }

        }

        
        
for ( i=0; i<n; i++ )
        
{
            
if ( ! op_c[i] )
            
{
                inq ( 
&i );
                op_c[i] 
= -1;
            }

        }

    }


    flag 
= 1;
    
for ( i=0; i<n; i++ )
    
{
        
if ( op_c[i] > 0 )
        
{
            flag 
= 0;
            
break;
        }

    }

    
if ( ! flag )
    
{
        
return 0;
    }

    
if ( len < n )
    
{
        
return -1;
    }

    
return 1;
}


int main ()
{
    
    
int n, m;
    
char in[5];
    
int flag;
    
int ans;
    
    
while ( scanf ( "%d%d"&n, &m ) != EOF )
    
{
        
if ( n==0 && m ==0 )
        
{
            
break;
        }


        init ( n );
        
        flag 
= 1;
        
for ( int i=0; i<m; i++ )
        
{
            scanf ( 
"%s"&in );
            
if ( ! flag )
            
{
                
continue;
            }

            
if ( in[0== in[2] )
            
{
                printf ( 
"Inconsistency found after %d relations.\n", i+1 );
                flag 
= 0;
            }

            
else
            
{
                add ( in[
0], in[2] );
                ans 
= sort ( n );
                
if ( ! ans )
                
{
                    printf ( 
"Inconsistency found after %d relations.\n", i+1 );
                    flag 
= 0;
                }

                
else if ( ans == 1 )
                
{
                    road[len] 
= '\0';
                    printf ( 
"Sorted sequence determined after %d relations: %s. \n", i+1, road );
                    flag 
= 0;
                }

            }

        }

        
if ( flag )
        
{
            printf ( 
"Sorted sequence cannot be determined.\n" );
        }

    }

    
return 0;
}


地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1094