LeeBlog

导航

HDU 3786 找出直系亲属 floyd

这题好悲剧啊,我用floyd做一直不能过,迷惑了我一晚上,改了N个地方还是wa,最后看着大牛代码改终于发现,floyd关系弄错了

#include<stdio.h>
int map[26][26];
void floyd(  )
{
     for( int i = 0; i < 26; ++i )
          for( int j = 0 ; j < 26; ++j )
               for( int k = 0; k < 26; ++k )
                    if( map[j][i] && map[i][k] )
                        map[j][k] = map[j][i] + map[i][k];//wa所在地 
     }
void print1( int n )
{
     while( n > 2 )
     {
            --n;
            printf( "great-" );
            }
     if( n == 2 )
         printf( "grand" );
     printf( "parent\n" );
 }
void print2( int n )
{
     while( n > 2 )
     {
            --n;
            printf( "great-" );
            }
     if( n == 2 )
         printf( "grand" );
     printf( "child\n" );
 }
int main( )
{
    int m,n;
    while( scanf( "%d%d%*c",&n,&m ),m|n )
    {
           for( int i = 0; i < 26; ++i )
                for( int j = 0; j < 26; ++j )
                     map[i][j] = 0;
           while( n-- )
           {
                  char a , b,c;
                  scanf( "%c%c%c%*c",&a,&b,&c );
                  a -= 'A';
                  if( b != '-' )
                  {
                      b -= 'A';
                      map[a][b] = 1;
                      }
                  if( c != '-' )
                  {
                      c -= 'A';
                      map[a][c] = 1;
                      }
                  }
           floyd(  );
           while( m-- )
           {
                  int a,b;
                  scanf( "%c%c%*c",&a,&b );
                  a -= 'A';
                  b -= 'A';
                  if( map[a][b] )
                      print2( map[a][b] );
                  else if( map[b][a] )
                       print1( map[b][a] );
                  else 
                       printf( "-\n" );
                  }
           }
    return 0;
}
原先的错误代码
#include<stdio.h>
int map[26][26];
void floyd(  )
{
     for( int i = 0; i < 26; ++i )
          for( int j = 0 ; j < 26; ++j )
               for( int k = 0; k < 26; ++k )
               {
                    if( map[i][j] && map[j][k] )
                        map[i][k] = map[i][j] + map[j][k];
                        
                }
 }
void print1( int n )
{
     while( n > 2 )
     {
            --n;
            printf( "great-" );
            }
     if( n == 2 )
         printf( "grand" );
     printf( "parent\n" );
 }
void print2( int n )
{
     while( n > 2 )
     {
            --n;
            printf( "great-" );
            }
     if( n == 2 )
         printf( "grand" );
     printf( "child\n" );
 }
int main( )
{
    int m,n;
    while( scanf( "%d%d%*c",&n,&m ),m|n )
    {
           for( int i = 0; i < 26; ++i )
                for( int j = 0; j < 26; ++j )
                     map[i][j] = 0;
           while( n-- )
           {
                  char a , b,c;
                  scanf( "%c%c%c%*c",&a,&b,&c );
                  a -= 'A';
                  if( b != '-' )
                  {
                      b -= 'A';
                      map[a][b] = 1;
                      }
                  if( c != '-' )
                  {
                      c -= 'A';
                      map[a][c] = 1;
                      }
                  }
           floyd(  );
           while( m-- )
           {
                  int a,b;
                  scanf( "%c%c%*c",&a,&b );
                  a -= 'A';
                  b -= 'A';
                  if( map[a][b] )
                      print2( map[a][b] );
                  else if( map[b][a] )
                       print1( map[b][a] );
                  else 
                       printf( "-\n" );
                  }
           }
    return 0;
}

posted on 2011-03-23 00:51  LeeBlog  阅读(313)  评论(0编辑  收藏  举报