| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
还没有查出什么错来,哪位高人指点一下!!!In Reply To:Re:郁闷中! Posted by:hust_acm at 2004-10-25 13:47:36 #include<stdio.h>
const int MAXL = 100 ;
int net[MAXL][MAXL]={0};
int pre[MAXL] ={0};
char stack[MAXL];
int top = -1 ,n,m;
int Isempty(void) // if is stack is empty ,then return 1 ,while return 0 in contrast
{
if( top <0 )return 1;
return 0;
}
char pop(void) // pop an element out of stack
{
return stack[top--];
}
void push( char temp ) // push an element into stack
{
stack[++top] = temp;
}
void ini( void ) // init
{
int i , j;
for ( i = 1;i <= n;i ++)
{
pre[i] = 0;
for ( j= 1;j <= n;j ++)
net[i][j] = 0;
}
top = -1;
}
int find_MAX( void ) // find the max of rest number ,if more than 1 was found ,then return -1;
{
int i , k=0 , z = 0 ;
for ( i = 1; i<= n ;i ++)
if( !pre[i] && pre[i] != -1 ){ k ++ ; z = i;}
if( k != 1 )return -1;
return z;
}
int DFS ( int x , int y )////////////////////////////////////DFS
{
int A[MAXL*MAXL]={x},len = 0,i,t;
int vis[MAXL]= {0};
while( len != -1 )
{
t = A[len --];
if( vis[ t ] ) continue;
vis [t] = 1;
if( pre[t] >0 )
{
for ( i = 1;i <= n ;i ++ )
{
if( net[t][i] )
{
if ( i == y ) return 1;
A[++len] = i;
}
}
}
}
return 0;
}
int Judge( void ) //if yield error ,return 0 ,else return 1
{
int p , q;
char s[5];
scanf("%s",s );
p = s[0] - 'A' + 1;
q = s[2] - 'A' + 1;
if( p == q ) return 0;
if ( s[1] == '<' )
{
if( DFS( q , p ))return 0;
net[p][q] ++;
pre[p] ++;
return 1;
}
if( s[1] == '>' )
{
if( DFS ( p , q )) return 0;
net[q][p] ++;
pre[q] ++;
return 1;
}
return 1;
}
int solve ( void )
{
int i , j ,t;
int a[MAXL][MAXL],b[MAXL];
for ( i = 1;i <= n;i ++)
{
b[i] = pre[i];
for( j = 1;j <= n;j ++)
a[i][j] = net[i][j];
}
for ( i= 1;i <= n;i ++)
{
t = find_MAX();pre[t] = -1;
if ( t == -1) goto loop;
push(t + 'A' - 1 );
for ( j = 1 ;j <= n; j ++ )
if( net[j][t])
{
pre[j] -= net[j][t] ;
net[j][t] = 0;
}
}
for ( i = 1;i <= n;i ++)
{
pre[i] = b[i];
for ( j= 1;j <= n;j ++)
net[i][j] = a[i][j];
}
return 1;
loop:
for ( i = 1;i <= n;i ++)
{
pre[i] = b[i];
for ( j= 1;j <= n;j ++)
net[i][j] = a[i][j];
}
return 0;
}
int main ( void )
{
int i , err , flag;
char s[4];
scanf("%d%d",&n , &m);
while ( n + m != 0)
{
ini();
err = 0; flag =0;
for ( i = 1;i <= m;i ++)
{
if( err ) scanf("%s",s);
else if( Judge() )
{
if( !flag && i >= n-1)
{
if(solve()) flag = i;
else top = -1;
}
}
else err = i;
}
if( err )
printf("Inconsistency found after %d relations.\n",err);
else if( flag)
{
printf("Sorted sequence determined after %d relations: ",flag);
while(!Isempty())
printf("%c",pop());
printf(".\n");
}
else
printf("Sorted sequence cannot be determined.\n");
scanf("%d%d",&n , &m );
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator