Pagini recente » Cod sursa (job #231210) | Cod sursa (job #114209) | Cod sursa (job #285695) | Cod sursa (job #629221) | Cod sursa (job #257389)
Cod sursa(job #257389)
#include<stdio.h>
#define INPUT "disjoint.in"
#define OUTPUT "disjoint.out"
#define NMAX 100001
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
long N, M;
long Father[ NMAX ], Degree[ NMAX ];
long root(long Node)
{
long nNode = Node;
long temp;
while(nNode != Father[nNode])
nNode = Father[nNode];
while(Father[Node] != Node)
{
temp = Father[Node];
Father[Node] = nNode;
Node = temp;
}
return nNode;
}
void join(long Node1, long Node2)
{
long Root1 = root(Node1);
long Root2 = root(Node2);
if(Degree[ Root1 ] > Degree[ Root2 ])
Father[ Root2 ] = Root1;
else
Father[ Root1 ] = Root2;
if(Degree[ Root1 ] == Degree[ Root2 ])
++Degree[ Root2 ];
}
void solve()
{
long Code, Node1, Node2;
for(long i = 0; i < M; ++i)
{
fscanf(fin, "%ld %ld %ld", &Code, &Node1, &Node2);
if(Code == 1)
join(Node1, Node2);
else
{
if(root(Node1) == root(Node2))
fprintf(fout, "DA\n");
else
fprintf(fout, "NU\n");
}
}
}
int main()
{
fscanf(fin, "%ld %ld", &N, &M);
for(long i = 0; i < N; ++i)
{
Father[ i ] = i;
Degree[ i ] = i;
}
solve();
fclose(fin);
fclose(fout);
return 0;
}