Pagini recente » Cod sursa (job #2858513) | Cod sursa (job #2143508) | Cod sursa (job #1679941) | Cod sursa (job #134586) | Cod sursa (job #2624343)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> parent, tree_size;
int nr_vertices, nr_edges;
inline void make_set(const int &vertex)
{
parent[vertex] = vertex;
tree_size[vertex] = 1;
}
int find_root(int &vertex)
{
if (parent[vertex] == vertex)
{
return vertex;
}
return parent[vertex] = find_root(parent[vertex]);
}
void unite_sets(int &node1, int &node2)
{
node1 = find_root(node1);
node2 = find_root(node2);
if (node1 != node2)
{
if (tree_size[node1] < tree_size[node2])
{
swap(node1, node2);
}
parent[node2] = node1;
tree_size[node1] += tree_size[node2];
}
}
bool is_in_same_connected_component(int &node1, int &node2)
{
return find_root(node1) == find_root(node2);
}
int main()
{
ifstream fin("disjoint.in");
fin >> nr_vertices >> nr_edges;
parent.resize(nr_vertices + 1);
tree_size.resize(nr_vertices + 1);
for (int node = 1; node <= nr_vertices; ++node)
{
make_set(node);
}
ofstream fout("disjoint.out");
while (nr_edges--)
{
short command;
int i, j;
fin >> command >> i >> j;
switch (command)
{
case 1:
unite_sets(i, j);
break;
default:
fout << (is_in_same_connected_component(i, j) ? "DA\n" : "NU\n");
}
}
}