家族(并查集)

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;

}


 

 

你可能感兴趣的:(并查集)