题中先用并查集判定是否所有点都有联系,即能够拼成一个连通的无向图。 再判定入度为零的点是否为1即可。
代码如下:
#include#include char name[2010][50];int cnt, N, dg[2010], hash[2010], set[2010];int find( char *n ){ int i; for( i= 0; i< cnt; ++i ) { if( strcmp( n, name[i] )== 0 ) { return i; } } strcpy( name[cnt], n ); return cnt++; // 在return的时候把cnt自增}int find( int x ){ return set[x]= x== set[x]? x: find( set[x] );}void merge( int x, int y ){ int a= find( x ), b= find( y ); set[a]= b;}int main( ){ while( scanf( "%d", &N ), N ) { char n1[50], n2[50]; cnt= 0; int edge= 0; memset( dg, 0, sizeof( dg ) ); memset( hash, 0 ,sizeof( hash ) ); for( int i= 0; i< 2010; ++i ) { set[i]= i; } for( int i= 1; i<= N; ++i ) { scanf( "%s %s", n1, n2 ); int a= find( n1 ), b= find( n2 ); if( find( a )!= find( b ) ) { merge( a, b ); edge++; } dg[b]++; } if( edge!= cnt- 1 ) { printf( "No\n" ); continue; } int shit= 0; for( int i= 0; i< cnt; ++i ) { if( dg[i]== 0 ) { shit++; } } printf( shit== 1? "Yes\n": "No\n" ); }}