Pagini recente » Cod sursa (job #1787061) | Cod sursa (job #2324273) | Cod sursa (job #2935794) | Cod sursa (job #919751) | Cod sursa (job #582260)
Cod sursa(job #582260)
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
using namespace std;
int f[N_MAX], r[N_MAX];
inline int _min( int x, int y ) { return ( x <= y ? x : y ); }
inline int find( int x )
{
int y, z;
for( y=f[x]; y != f[y]; y=f[y] );
for( x=f[x]; x != f[x]; x=z )
{
z=f[x];
f[x]=y;
}
return y;
}
inline void unite( int x, int y )
{
if( r[x] == r[y] )
{
if( x != y )
f[x]=y;
++r[x];
}
else r[x]=r[y]=_min( r[x], r[y] );
}
int main( void )
{
int N, M, i, j, k;
ifstream in( "disjoint.in" );
ofstream out( "disjoint.out" );
in>>N>>M;
for( i=1; i <= N; ++i )
f[i]=i, r[i]=1;
for( ; M; --M )
{
in>>i>>j>>k;
switch(i)
{
case 1 : unite( find(j), find(k) ); break;
case 2 : out<<( find(j) == find(k) ? "DA\n" : "NU\n" );
}
}
return EXIT_SUCCESS;
}