家族(并查集)
http://wikioi.com/problem/1073/
典型并查集,只需要判断find( x ) 和find( y) 是否在一个集合里面即可
// File Name: wiki1073.cpp // Author: bo_jwolf // Created Time: 2013年08月17日 星期六 16时36分22秒 #include<vector> #include<list> #include<map> #include<set> #include<deque> #include<stack> #include<bitset> #include<algorithm> #include<functional> #include<numeric> #include<utility> #include<sstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; const int maxn = 5005 ; int fa[ maxn ] ; struct node { int x , y ; }edge[ maxn << 2 ] ; int find( int x ) { return fa[ x ] = fa[ x ] == x ? x : find( fa[ x ] ) ; } int main() { int n , m , p ; while( cin >> n >> m >> p ) { for( int i = 0 ; i <= n ; ++i ) fa[ i ] = i ; for( int i = 1 ; i <= m ; ++i ) { cin >> edge[ i ].x >> edge[ i ].y ; } for( int i = 1 ; i <= m ; ++i ) { int x = find( edge[ i ].x ) ; int y = find( edge[ i ].y ) ; if( x != y ) { fa[ x ] = y ; } } int x , y ; for( int i = 1 ; i <= p ; ++i ) { cin >> x >> y ; if( find( x ) == find( y ) ) cout << "Yes" << endl ; else cout << "No" << endl ; } } return 0; }