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; }
本人还是新手 ,转载请注明来自Lvsi‘s home